鱼C论坛

 找回密码
 立即注册
查看: 1120|回复: 2

[已解决]报数问题

[复制链接]
发表于 2021-1-13 00:24:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int n,i,j;
  5.     scanf("%d",&n);
  6.     int a[100]={0};
  7.     for(i=0;i<n;i++)
  8.     {
  9.         a[i]=i+1;
  10.     }
  11.     i=0;
  12.     int i1=1,count=n-1;
  13.     while(count)
  14.     {
  15.         if(a[i]!=0)
  16.         {
  17.             if(i1%3==0)
  18.             {
  19.                 a[i]=0;
  20.                 count--;
  21.             }
  22.             if(i==n-1)
  23.             {
  24.                 i=0;
  25.             }
  26.             else
  27.             {
  28.                 i++;
  29.             }
  30.             i1=i1+1;
  31.             if(i1==4)
  32.             {
  33.                 i1=1;
  34.             }
  35.         }
  36.         else
  37.         {
  38.             if(i<n-1)
  39.             {
  40.                 i++;
  41.             }
  42.             else if(i==n-1)
  43.             {
  44.                 i=0;
  45.             }
  46.         }
  47.     }
  48.     for(i=0;i<n;i++)
  49.     {
  50.         if(a[i]!=0)
  51.         {
  52.             printf("%d",a[i]);
  53.         }
  54.     }
  55.     return 0;
  56. }
复制代码

找个人帮我优化一下,感觉我写的好乱
最佳答案
2021-1-13 01:40:25
本帖最后由 jackz007 于 2021-1-13 02:20 编辑
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int d[200] = {0} , e , i , j  , n                         ;
  5.         scanf("%d" , & n)                                         ;
  6.         for(i = 1 ; i < n + 1 ; i ++) d[i] = i                    ; // 用索引号为数组元素编号
  7.         for(e = 0 , i = 1 ; n > 2 ;) {
  8.                 e ++                                              ;
  9.                 if(e == 3) {                                        // 数到 3
  10.                         for(j = i ; j < n ; j ++) d[j] = d[j + 1] ; // 数组整体向前搬家,删除数到 3 的数组元素
  11.                         e = 0                                     ;
  12.                         n --                                      ;
  13.                 } else {
  14.                         i ++                                      ;
  15.                 }
  16.                 if(i > n) i = 1                                   ;
  17.         }
  18.         printf("%d\n" , d[2])                                     ; // 最后剩下 2 个元素,显示后面的那个
  19. }
复制代码
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-13 01:23:33 | 显示全部楼层
这个问题我回答过,我的程序如下(不是对你的程序的优化,从今年开始,我已经不再回答花时间多的问题了,不好意思):
  1. // 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后
  2. // 留下的是原来第几号的那位
  3. #include<stdio.h>
  4. #define nmax 50
  5. main()
  6. {
  7.         int i, k, m, n, num[nmax], *p;
  8.         printf("please input the total of numbers:");
  9.         scanf("%d", &n);
  10.         p = num;
  11.         for (i = 0;i < n;i++)
  12.                 *(p + i) = i + 1;
  13.         i = 0;
  14.         k = 0;
  15.         m = 0;
  16.         while (m < n - 1)
  17.         {
  18.                 if (*(p + i) != 0)
  19.                         k++;              // 报数号
  20.                 if (k == 3)           // 报数为3的置0出局
  21.                 {
  22.                         *(p + i) = 0;
  23.                         k = 0;
  24.                         m++;              // 出局人数
  25.                 }
  26.                 i++;                  // 数组的下标
  27.                 if (i == n)
  28.                         i = 0;            // 一轮报数完成,重新开始报数
  29.         }
  30.         while (*p == 0) p++;
  31.         printf("The last one is %d\n", *p);
  32. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-13 01:40:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-13 02:20 编辑
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int d[200] = {0} , e , i , j  , n                         ;
  5.         scanf("%d" , & n)                                         ;
  6.         for(i = 1 ; i < n + 1 ; i ++) d[i] = i                    ; // 用索引号为数组元素编号
  7.         for(e = 0 , i = 1 ; n > 2 ;) {
  8.                 e ++                                              ;
  9.                 if(e == 3) {                                        // 数到 3
  10.                         for(j = i ; j < n ; j ++) d[j] = d[j + 1] ; // 数组整体向前搬家,删除数到 3 的数组元素
  11.                         e = 0                                     ;
  12.                         n --                                      ;
  13.                 } else {
  14.                         i ++                                      ;
  15.                 }
  16.                 if(i > n) i = 1                                   ;
  17.         }
  18.         printf("%d\n" , d[2])                                     ; // 最后剩下 2 个元素,显示后面的那个
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 16:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表