• c刷题【五】


    目录

    喝汽水问题

     变种水仙花

    奇偶分离

    判断有序序列

     有序序列合并

    X型图案 

    箭型图案 

    猜排名

     猜凶手


    喝汽水问题

    1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
    

    设置三个变量,金钱,空瓶数和汽水数。其中初始汽水数和空瓶为金钱总数。利用空瓶回收进行循环,需要注意当空瓶为奇数时需要保留下来以便进行下一次兑换。

    1. int money = 0;
    2. int total = 0;
    3. int empty = 0;
    4. scanf("%d", &money);
    5. total = money;
    6. empty = money;
    7. while (empty >= 2)
    8. {
    9. total += empty / 2;
    10. empty = empty / 2 + empty % 2;
    11. }
    12. printf("%d\n", total);

    我们可以通过多组输入发现金钱和汽水数有一个确定的规律: total = moeny*2 +1 

     变种水仙花

     对于乘号前面的数,可通过/10,/100...获取,乘号后面的数通过%10,%100...获取,结束条件是不超过当前位数。

    1. #include
    2. #include
    3. int main() {
    4. int i = 0;
    5. for(i = 10000; i <= 99999; i++)
    6. {
    7. int sum = 0;
    8. int j = 0;
    9. for(j = 1;j<=4;j++)
    10. {
    11. int ret = (int)pow(10,j);
    12. sum += (i%ret) * (i/ret);
    13. }
    14. if(sum == i)
    15. printf("%d ",sum);
    16. }
    17. return 0;
    18. }

    奇偶分离

    提供一种时间复杂度最低的做法——双指针遍历左边遇到偶数,右边遇到奇数双双交换,当left>=right时,没有必要再交换。

    1. void move_even_odd(int arr[], int sz)
    2. {
    3. int left = 0;
    4. int right = sz - 1;
    5. while (left < right)
    6. {
    7. //从前往后找一个偶数停下来
    8. while ((left < right) && (arr[left] % 2 == 1))
    9. {
    10. left++;
    11. }
    12. //从后往前找一个奇数停下来
    13. while ((left < right) && (arr[right] % 2 == 0))//
    14. {
    15. right--;
    16. }
    17. if (left < right)
    18. {
    19. int tmp = arr[left];
    20. arr[left] = arr[right];
    21. arr[right] = tmp;
    22. left++;
    23. right--;
    24. }
    25. }
    26. }

    需要注意避免越界和全奇全偶的情况,在移动和交换前都要判断left是否小于right。

    判断有序序列

    有序序列判断_牛客题霸_牛客网

    设置两个开关变量,根据升序和降序分别处理,要单独拎出其中有相等的情况(1 1 2 2 4), 和全等的情况(1 1 1 1 1)。

    1. #include
    2. int main() {
    3. int n = 0;
    4. scanf("%d",&n);
    5. int arr[n];
    6. int i=0;
    7. int flag1 = 0;//升序
    8. int flag2 = 0;//降序
    9. for(i=0;i< n;i++)
    10. {
    11. scanf("%d", &arr[i]);
    12. }
    13. for(i=0;i-1;i++)
    14. {
    15. if(arr[i] < arr[i+1])
    16. flag1 = 1;
    17. if(arr[i] > arr[i+1])
    18. flag2 = 1;
    19. //等于不做处理
    20. }
    21. if(flag1 + flag2 <=1)//包含数据全等的情况
    22. printf("sorted\n");
    23. else
    24. printf("unsorted");
    25. return 0;
    26. }

     有序序列合并

    方法一:两个数组合并成一个数组进行快排。

    1. #include
    2. #include
    3. int compare(const void* a, const void* b)
    4. {
    5. return *(int*)a - *(int*)b;
    6. }
    7. int main()
    8. {
    9. int n, m;
    10. scanf("%d %d", &n, &m);
    11. int arr1[n] ;
    12. int arr2[m] ;
    13. int arr3[n+m];//初始化为0
    14. int i = 0;
    15. int j = 0;
    16. for (i = 0; i < n; i++)//自己设置字符串数据
    17. {
    18. scanf("%d", &arr1[i]);//别忘了取地址
    19. }
    20. for (i = 0; i < m; i++)
    21. {
    22. scanf("%d", &arr2[i]);
    23. }
    24. for (i = 0; i < n+m; i++)
    25. {
    26. if (i < n)
    27. arr3[i] = arr1[i];
    28. else
    29. {
    30. arr3[i] = arr2[j];
    31. j++;
    32. }
    33. }
    34. qsort(arr3, n+m, sizeof(int), compare);
    35. for (i = 0; i < n+m; i++)
    36. {
    37. printf("%d ", arr3[i]);
    38. }
    39. return 0;
    40. }

    方法二:利用指针比较大小遍历数组,再输出数组剩余部分。

    1. #include
    2. int main()
    3. {
    4. int n, m;
    5. scanf("%d %d", &n, &m);
    6. int arr1[n];
    7. int arr2[m];
    8. int i = 0;
    9. int j = 0;
    10. for (i = 0; i < n; i++)//自己设置字符串数据
    11. {
    12. scanf("%d", &arr1[i]);//别忘了取地址
    13. }
    14. for (i = 0; i < m; i++)
    15. {
    16. scanf("%d", &arr2[i]);
    17. }
    18. i = 0;
    19. j = 0;
    20. while(i
    21. {
    22. if(arr1[i] < arr2[j])
    23. {
    24. printf("%d ",arr1[i]);
    25. i++;
    26. }
    27. else
    28. {
    29. printf("%d ",arr2[j]);
    30. j++;
    31. }
    32. }
    33. if(i == n)
    34. {
    35. for(;j
    36. printf("%d ",arr2[j]);
    37. }
    38. else
    39. {
    40. for(;i
    41. printf("%d ",arr1[i]);
    42. }
    43. return 0;
    44. }

    X型图案 

    X形图案_牛客题霸_牛客网

    规律是二维数组的主对角线和副对角线,主对角线行列相等,副对角线行列和为一个定值

    1. #include
    2. int main()
    3. {
    4. int i = 0,n = 0;
    5. while (scanf("%d", &n) == 1)
    6. {
    7. for (i = 0; i < n; i++)//打印出X图形其实就是模拟二维数组,规律是对角线输出
    8. {
    9. int j = 0;
    10. for (j = 0; j < n; j++)
    11. {
    12. if (i == j || i+j == n-1)
    13. printf("*");
    14. else
    15. printf(" ");//剩余的直接为 ‘ ’
    16. }
    17. printf("\n");
    18. }
    19. }
    20. return 0;
    21. }

    箭型图案 

    箭形图案_牛客题霸_牛客网

    要点:分上半和下半打印,注意空格可以两个一打印,灵活利用行(i)的变化打印。 

    1. #include
    2. int main()
    3. {
    4. int i = 0,n = 0;
    5. while (scanf("%d", &n) == 1)
    6. {
    7. for (i = 0; i < n+1; i++)
    8. {
    9. int j = 0;
    10. for (j = 0; j < n-i; j++)
    11. {
    12. printf(" ");
    13. }
    14. for(j = 0;j<=i;j++)
    15. {
    16. printf("*");
    17. }
    18. printf("\n");
    19. }
    20. for (i = 0; i
    21. {
    22. int j = 0;
    23. for (j = 0; j <= i; j++)
    24. {
    25. printf(" ");
    26. }
    27. for (j = 0; j < n-i; j++)
    28. {
    29. printf("*");
    30. }
    31. printf("\n");
    32. }
    33. }
    34. return 0;
    35. }

    猜排名

    5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

    A选手说:B第二,我第三;

    B选手说:我第二,E第四;

    C选手说:我第一,D第二;

    D选手说:C最后,我第三;

    E选手说:我第四,A第一;

    逻辑推断题,可以利用穷举法, 比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。说对一半可以译为1+0 == 1,每位可以译为&&。

    1. int a = 0;
    2. int b = 0;
    3. int c = 0;
    4. int d = 0;
    5. int e = 0;
    6. for (a = 1; a <= 5; a++)
    7. {
    8. for (b = 1; b <= 5; b++)
    9. {
    10. for (c = 1; c <= 5; c++)
    11. {
    12. for (d = 1; d <= 5; d++)
    13. {
    14. for (e = 1; e <= 5; e++)
    15. {
    16. if (((b==2) + (a==3) == 1) &&
    17. ((b==2) + (e==4) == 1) &&
    18. ((c==1) + (d==2) == 1) &&
    19. ((c==5) + (d==3) == 1) &&
    20. ((e==4) + (a==1) == 1))
    21. {
    22. if((a * b * c * d * e == 120) &&(a+b+c+d+e==15))
    23. printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
    24. }
    25. }
    26. }
    27. }
    28. }
    29. }

    可以看到在输出结果时我添加了判断条件,是因为结果有多个名次重名了,因为遍历时并没有考虑名次占用问题,所以我们根据每个排名的独特性添加判断筛选出不重复的排名即可。

     猜凶手

    日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。

    以下为4个嫌疑犯的供词:

    A说:不是我。

    B说:是C。

    C说:是D。

    D说:C在胡说。

    已知3个人说了真话,1个人说的是假话。

    现在请根据这些信息,写一个程序来确定到底谁是凶手。

    先假定一人说的是假话。3真话,1假话:4人逻辑判断之和为3。

    1. int killer = 0;
    2. for (killer = 'A'; killer <= 'D'; killer++)
    3. {
    4. if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
    5. printf("%c", killer);
    6. }

  • 相关阅读:
    别再自己瞎写工具类了,Spring Boot 内置工具类应有尽有, 建议收藏
    AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.03.05-2024.03.10
    关于Python数据分析,这里有一条高效的学习路径
    Kali Linux 2022新版发布
    合宙Air724UG LuatOS-Air LVGL API控件-微调框 (Spinbox)
    4款黑科技软件,其中三款功能过于强大,被误认为是外国佬开发的
    【笑小枫的SpringBoot系列】【十一】SpringBoot接口日志信息统一记录
    动态内存管理
    Java中OutputStream.flush()具有什么功能呢?
    jsp家教信息发布网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 原文地址:https://blog.csdn.net/dwededewde/article/details/133146625