鱼C论坛

 找回密码
 立即注册
查看: 1761|回复: 7

[已解决]c语言解决从一开始的报数问题

[复制链接]
发表于 2022-5-23 01:16:42 | 显示全部楼层 |阅读模式

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

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

x
有N个人围成一圈,顺序排号。

从第一个人开始报数,凡是报数中的尾数为3,或能被3整除,就退出圈子。

问最后留下的是原来第几号的人,最后报数报到多少?

比如:N=3,3个人,从第1号开始,从1开始报数

报数:1   2   3            4   5   6             7

编号:1   2   3(退出)  1   2   1(退出)   2(只剩最后一个人)

最后报数最高是7,剩下的人编号是2



编写代码,要求:

1)用数组保存游戏参加人列表(最多不超过N)

      int LOOP[N];

2)数组取值为1或0,其中1代表参加报数,0代表被淘汰(1 TRUE / 0 FALSE)

3)键盘输入参加人数(人数<N)

4)编写函数处理游戏逻辑,输入指针(数组名)和参加人数(实际参加人数),输出报数最高值和最终胜利人编号

          int loops(int* p, int nums, int* top, int* id);

      p为输入指针,nums为输入人数,top为返回的最高值,id为返回的最终剩下的人编号

5)打印输出最高值和胜利者编号



其中:

1)函数内用 指针++  操作遍历参加人

2)函数内用 指针赋值 操作完成从队尾到对头的循环
最佳答案
2022-5-23 11:39:46
本帖最后由 傻眼貓咪 于 2022-5-23 11:41 编辑

完全以题目要求为条件的代码:
  1. #include <stdio.h>
  2. #define N 20 // 设最高人数

  3. // 编写函数处理游戏逻辑,输入指针(数组名)和参加人数(实际参加人数)
  4. int loops(int* p, int nums, int* top, int* id) {
  5.         if (nums < 1) return 0;
  6.         *top = 0;
  7.        
  8.         // 函数内用 指针++  操作遍历参加人
  9.         // 函数内用 指针赋值 操作完成从队尾到对头的循环
  10.         for (int *q = p, out = 0; out < nums - 1; ++q) {
  11.                 if (q == p + nums) {
  12.                         q = p;
  13.                 }
  14.                 if (*q) {
  15.                         (*top)++;
  16.                         if ((*top) % 10 == 3 || !((*top) % 3)) {
  17.                                 (*q) = 0;
  18.                                 out++;
  19.                         }
  20.                 }
  21.         }
  22.         for (int *q = p, i = 1; q < p + nums; ++q, ++i) {
  23.                 if (*q) {
  24.                         (*id) = i;
  25.                         (*top)++;
  26.                 }
  27.         }
  28.         return 1;
  29. }

  30. int main(void) {
  31.         int
  32.                 n,
  33.                 LOOP[N] = { 0 }, // 用数组保存游戏参加人列表(最多不超过N)
  34.                 top, id; // top为返回的最高值,id为返回的最终剩下的人编号
  35.        
  36.         // 键盘输入参加人数(人数<N)
  37.         scanf("%d", &n);
  38.        
  39.         // 数组取值为 1 或 0,其中 1 代表参加报数,0 代表被淘汰(1 TRUE / 0 FALSE)
  40.         for (int i = 0; i < n; ++i) LOOP[i] = 1;
  41.        
  42.         loops(LOOP, n, &top, &id);
  43.        
  44.         // 输出报数最高值和最终胜利人编号
  45.         printf("最高值: %d\n", top);
  46.         printf("胜利者编号: %d", id);
  47.         return 0;
  48. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-23 07:13:16 | 显示全部楼层
  1. pnum Numoff(pnum head,int *n)
  2. {
  3.         pnum p=head->next,q=p;
  4.         int i=1;
  5.         while (p->next!=p)
  6.         {
  7.                 if(i%3==0)
  8.                 {
  9.                         q->next=p->next;
  10.                         if (p==head->next)
  11.                         {

  12.                                 head->next=q->next;
  13.                        
  14.                         }
  15.                 }
  16.                 q=p;
  17.                 p=p->next;
  18.                 i++;
  19.         }
  20.         *n=i;
  21.         return head->next;
  22. }
  23. int main(void)
  24. {
  25.         int i=0,n=0;
  26.         scanf("%d",&n);
  27.         pnum num=(pnum)malloc(sizeof(NUMBER)*(n+1));
  28.         for (i = 0; i < n; i++)
  29.         {
  30.                 num[i].id=i;
  31.                 num[i].next=&num[i+1];
  32.         }
  33.         num[i].id=i,num[i].next=&num[1];
  34.         Numoff(num,&n);
  35.         printf("%d %d",n,num[0].next->id);
  36.         return 0;
  37. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-23 07:44:09 From FishC Mobile | 显示全部楼层
jhq999 发表于 2022-5-23 07:13

人家让用数组做,链表肯定好做些,数组的删除啊还是首尾链接啊都不咋好弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-23 09:06:22 | 显示全部楼层
本帖最后由 jhq999 于 2022-5-23 09:25 编辑
wp231957 发表于 2022-5-23 07:44
人家让用数组做,链表肯定好做些,数组的删除啊还是首尾链接啊都不咋好弄

最笨的扫描,

  1. int loops(int* p, int nums, int* top, int* id)
  2. {
  3.         int i = 0,j=1,flag=nums;
  4.         while (flag-1)
  5.         {
  6.                 for (i = 0; i < nums; i++)
  7.                 {
  8.                         if (p[i])
  9.                         {
  10.                                 if (j%3==0)
  11.                                 {
  12.                                         p[i]=0;
  13.                                         flag--;
  14.                                         if (1==flag)break;
  15.                                 }
  16.                                 j++;
  17.                         }
  18.                 }
  19.                 //if (1==flag)break;
  20.         }
  21.         for (i = 0; 0==p[i]; i++);
  22.         *id=1==nums?1:i+1;
  23.         *top=1==nums?1:j+1;
  24.         return i;
  25. }
  26. int main(void)
  27. {
  28.         int i=0,n=0,top=0,id=-1;
  29.         scanf("%d",&n);
  30.         int* num=(int*)malloc(sizeof(int)*n);
  31.         for (i = 1; i <n; i++)
  32.         {
  33.                 num[i]=1;
  34.                
  35.         }
  36.        
  37.         loops(num,n,&top,&id);
  38.         printf("%d %d",top ,id);
  39.         return 0;
  40. }
复制代码
  1. int loops(int* p, int nums, int* top, int* id)
  2. {
  3.         int i = 0,j=1,flag=nums;
  4.         while (flag-1)
  5.         {
  6.                 for (i = 0; i < nums&&(flag-1); i++)
  7.                 {
  8.                         if (p[i])
  9.                         {
  10.                                 if (j%3==0)
  11.                                 {
  12.                                         p[i]=0;
  13.                                         flag--;
  14.                                         //if (1==flag)break;
  15.                                 }
  16.                                 j++;
  17.                         }
  18.                 }
  19.                 //if (1==flag)break;
  20.         }
  21.         for (i = 0; 0==p[i]; i++);
  22.         *id=i+1;
  23.         *top=j;
  24.         return i;
  25. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-23 10:30:29 | 显示全部楼层

我没用指针,也算笨笨的思想吧
  1. int        printf (const char *__restrict, ...);
  2. #define max 15

  3. int main()
  4. {
  5.     int s[max]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  6.     int num=1;
  7.     int sum=0;
  8.     int r=0;
  9.     int n=0;
  10.     while(1)
  11.     {
  12.         for(int x=0;x<max;x++)
  13.         {
  14.             if(num%3==0 && s[x])
  15.             {
  16.                 s[x]=0;
  17.                 num++;
  18.             }
  19.             if(num%3!=0 && s[x])
  20.             {
  21.                 sum++;
  22.                 r=s[x];    //一旦sum==1  这个r  n  就是我们要的结果
  23.                 n=num;
  24.             }
  25.             if(s[x]) num++;
  26.         }
  27.         if (sum==1)
  28.         {
  29.             printf("结果剩下 :%4d 数数数到 %d\n",r,n);
  30.             break;
  31.         }
  32.         sum=0;
  33.     }
  34.     return 0;
  35. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-23 11:39:46 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2022-5-23 11:41 编辑

完全以题目要求为条件的代码:
  1. #include <stdio.h>
  2. #define N 20 // 设最高人数

  3. // 编写函数处理游戏逻辑,输入指针(数组名)和参加人数(实际参加人数)
  4. int loops(int* p, int nums, int* top, int* id) {
  5.         if (nums < 1) return 0;
  6.         *top = 0;
  7.        
  8.         // 函数内用 指针++  操作遍历参加人
  9.         // 函数内用 指针赋值 操作完成从队尾到对头的循环
  10.         for (int *q = p, out = 0; out < nums - 1; ++q) {
  11.                 if (q == p + nums) {
  12.                         q = p;
  13.                 }
  14.                 if (*q) {
  15.                         (*top)++;
  16.                         if ((*top) % 10 == 3 || !((*top) % 3)) {
  17.                                 (*q) = 0;
  18.                                 out++;
  19.                         }
  20.                 }
  21.         }
  22.         for (int *q = p, i = 1; q < p + nums; ++q, ++i) {
  23.                 if (*q) {
  24.                         (*id) = i;
  25.                         (*top)++;
  26.                 }
  27.         }
  28.         return 1;
  29. }

  30. int main(void) {
  31.         int
  32.                 n,
  33.                 LOOP[N] = { 0 }, // 用数组保存游戏参加人列表(最多不超过N)
  34.                 top, id; // top为返回的最高值,id为返回的最终剩下的人编号
  35.        
  36.         // 键盘输入参加人数(人数<N)
  37.         scanf("%d", &n);
  38.        
  39.         // 数组取值为 1 或 0,其中 1 代表参加报数,0 代表被淘汰(1 TRUE / 0 FALSE)
  40.         for (int i = 0; i < n; ++i) LOOP[i] = 1;
  41.        
  42.         loops(LOOP, n, &top, &id);
  43.        
  44.         // 输出报数最高值和最终胜利人编号
  45.         printf("最高值: %d\n", top);
  46.         printf("胜利者编号: %d", id);
  47.         return 0;
  48. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-5-23 15:39:01 | 显示全部楼层
傻眼貓咪 发表于 2022-5-23 11:39
完全以题目要求为条件的代码:

感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-23 15:39:41 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 16:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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