鱼C论坛

 找回密码
 立即注册
查看: 1332|回复: 20

[已解决]这程序错哪了?结果输不出啊,猴子选大王的题目。

[复制链接]
发表于 2021-12-22 20:27:17 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. main()
  3. {
  4.         int a[100],N,number,count;
  5.         scanf("%d",&N);
  6.         number=N;
  7.         for(int i=0;i<N;i++)
  8.         {
  9.                 a[i]=1;
  10.         }
  11.         while(number>1)
  12.         {
  13.                 for(i=0;i<N;i++)
  14.                 {
  15.                         if(a[i]==0)
  16.                         continue;
  17.                         count++;
  18.                         if(count==3)
  19.                         {
  20.                                 number--;
  21.                                 count=0;
  22.                                 a[i]=0;
  23.                         }
  24.                 }
  25.         }
  26.         for(i=0;i<N;i++)
  27.         {
  28.                 if(a[i]!=0)
  29.                 printf("%d\n",a[i]);
  30.         }
  31. }
复制代码
最佳答案
2021-12-22 23:55:08
小黄练编程 发表于 2021-12-22 23:36
那我上面哪出了问题,不可能结果都出不来吧,就算是个乱码也算结果。但有时输入时,像卡死了一样,不给出 ...
  1. #include<stdio.h>
  2. main()
  3. {
  4.         int a[100] , i , N , number , count                       ;
  5.         scanf("%d" , & N)                                         ;
  6.         number = N                                                ;
  7.         for(i = 0 ; i < N ; i ++) a[i] = 1                        ;
  8.         while(number > 1)
  9.         {
  10.                 for(i = 0 ; i < N ; i ++)
  11.                 {
  12.                         if(a[i])
  13.                         {
  14.                                 count ++                          ;
  15.                                 if(count == 3)
  16.                                 {
  17.                                         number --                 ;
  18.                                         count = 0                 ;
  19.                                         a[i] = 0                  ;
  20.                                 }
  21.                         }
  22.                 }
  23.         }
  24.         for(i = 0 ; i < N ; i ++) if(a[i]) printf("%d\n" , i + 1) ;
  25. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-12-22 20:58:21 | 显示全部楼层
        把题目说明和要求贴一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-22 21:46:29 | 显示全部楼层
jackz007 发表于 2021-12-22 20:58
把题目说明和要求贴一下

我对照好多遍了,思路确实是这样,但就是不知道为何输不出结果,不知道程序错哪了,最起码得出来个结果啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-22 21:49:02 | 显示全部楼层
jackz007 发表于 2021-12-22 20:58
把题目说明和要求贴一下

有时候编译啥的都没错,但运行时就没用,比如有时候scanf("%d",&a);少了&,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-22 21:50:03 | 显示全部楼层
jackz007 发表于 2021-12-22 20:58
把题目说明和要求贴一下

题目  n个猴子围成一圈,从第1个猴子开始重复数一二三,数到三的猴子从圈子中出来,最后剩下的一个猴子就是大王。编程模拟此过程,输出猴子出圈的编号次序和大王的编号。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 22:18:10 | 显示全部楼层
本帖最后由 jackz007 于 2021-12-22 22:25 编辑
小黄练编程 发表于 2021-12-22 21:50
题目  n个猴子围成一圈,从第1个猴子开始重复数一二三,数到三的猴子从圈子中出来,最后剩下的一个猴子就 ...

        就是约瑟夫环问题
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int d[100] , e , i , n , m                         ;
  5.         scanf("%d" , & n)                                  ;
  6.         for(e = i = 0 ; i < n ; i ++) d[i] = i + 1         ;
  7.         for(m = n , i = 0 ; m > 1 ; i ++) {
  8.                 if(d[i % n]) {
  9.                         e ++                               ;
  10.                         if(! (e % 3)) {
  11.                                 if(m < n) printf(" , ")    ;
  12.                                 printf("%d" , (i % n) + 1) ;
  13.                                 d[i % n] = 0               ;
  14.                                 m --                       ;
  15.                         }
  16.                 }
  17.         }
  18.         printf("\n")                                       ;
  19.         for(i = 0 ; i < n ; i ++) if(d[i]) break           ;
  20.         printf("The monkey king is %d\n" , d[i])           ;
  21. }
复制代码

        编译、运行实况:
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 41
  4. 3 , 6 , 9 , 12 , 15 , 18 , 21 , 24 , 27 , 30 , 33 , 36 , 39 , 1 , 5 , 10 , 14 , 19 , 23 , 28 , 32 , 37 , 41 , 7 , 13 , 20 , 26 , 34 , 40 , 8 , 17 , 29 , 38 , 11  ,  25 , 2 , 22 , 4 , 35 , 16
  5. The monkey king is 31
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-22 23:36:41 | 显示全部楼层
jackz007 发表于 2021-12-22 22:18
就是约瑟夫环问题

        编译、运行实况:

那我上面哪出了问题,不可能结果都出不来吧,就算是个乱码也算结果。但有时输入时,像卡死了一样,不给出结果。。就像我说的scanf少了&。还有if(),括号中只打一个=。他就运行不了,其他就没问题。
还有的情况,第一步查错没问题,结果建立就出现一个错误,每次都得立马关了编译器,然后重开,在复制回去按一遍,
能教教我这些知识吗,大哥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-22 23:55:08 | 显示全部楼层    本楼为最佳答案   
小黄练编程 发表于 2021-12-22 23:36
那我上面哪出了问题,不可能结果都出不来吧,就算是个乱码也算结果。但有时输入时,像卡死了一样,不给出 ...
  1. #include<stdio.h>
  2. main()
  3. {
  4.         int a[100] , i , N , number , count                       ;
  5.         scanf("%d" , & N)                                         ;
  6.         number = N                                                ;
  7.         for(i = 0 ; i < N ; i ++) a[i] = 1                        ;
  8.         while(number > 1)
  9.         {
  10.                 for(i = 0 ; i < N ; i ++)
  11.                 {
  12.                         if(a[i])
  13.                         {
  14.                                 count ++                          ;
  15.                                 if(count == 3)
  16.                                 {
  17.                                         number --                 ;
  18.                                         count = 0                 ;
  19.                                         a[i] = 0                  ;
  20.                                 }
  21.                         }
  22.                 }
  23.         }
  24.         for(i = 0 ; i < N ; i ++) if(a[i]) printf("%d\n" , i + 1) ;
  25. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 09:54:58 | 显示全部楼层

你这代码跟我情况一样啊,输进去一个数,按几下回车,也是没反应
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 10:53:48 From FishC Mobile | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-12-23 10:56 编辑

  1. #include <stdio.h>

  2. int main(){
  3.         int n, m = 3;
  4.         scanf("%d", &n);
  5.         int arr[n];
  6.         for(int i = 0; i < n; i++) *(arr+i) = i+1;
  7.         for(int c, j, i = c = j = 0; j < n; i++){
  8.                 if(*(arr+(i%n))){
  9.                         c++;
  10.                         if(c == m){
  11.                                 c %= m;
  12.                                 if(j < n-1) printf("%d ", *(arr+(i%n)));
  13.                                 else printf("\nThe Monkey King is: %d", *(arr+(i%n)));
  14.                                 *(arr+(i%n)) = 0;
  15.                                 j++;
  16.                         }
  17.                 }
  18.         }
  19.         return 0;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 17:38:18 | 显示全部楼层
楼主的代码是在for循环里定义的i 之后的i 和a[i]应该都会报错啊。。。你的编译器不会报错吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 18:06:35 | 显示全部楼层
zxy0107 发表于 2021-12-23 17:38
楼主的代码是在for循环里定义的i 之后的i 和a应该都会报错啊。。。你的编译器不会报错吗

你在讲啥兄弟???是不是知道哪里出了问题,赶紧指点下啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 19:33:24 | 显示全部楼层
QQ截图20211223193148.png
你的i是在for循环里定义的 出了for循环就不能用了 我只知道这一个原因 但在我电脑上是报错的 程序都无法运行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 19:40:25 | 显示全部楼层
如果在前边定义了i=0如图,就能输出结果,但结果也不对,你的程序得到的结果永远是1,因为你的a[i]初值是1,后来只有一个是1,其余都是0了,最后输出的应该是i+1的值吧
我也只是小白,如果说错了见谅 QQ截图20211223194015.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 19:42:25 | 显示全部楼层
8楼的代码我这是可以运行的,是正解(我可能只是解释了一下8楼帮你改的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 21:46:45 | 显示全部楼层
zxy0107 发表于 2021-12-23 19:42
8楼的代码我这是可以运行的,是正解(我可能只是解释了一下8楼帮你改的代码

确实,我后面才反应过来,我这需要把最后的a[i]改为i。  但是为什么输不出结果啊,没点动静,按了几下回车。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 21:51:29 | 显示全部楼层
zxy0107 发表于 2021-12-23 19:42
8楼的代码我这是可以运行的,是正解(我可能只是解释了一下8楼帮你改的代码
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int  a[100];
  5.         int num,n,count=0;
  6.         printf("请输入猴子数量=");
  7.         scanf("%d",&n);
  8.         num=n;
  9.         for(int i=1;i<n;i++)
  10.         {
  11.                 a[i]=1;
  12.         }
  13.         while(num>1)
  14.         {
  15.                 for(i=1;i<n;i++)
  16.                 {
  17.                         if(a[i]==0)
  18.                         continue;
  19.                         count++;
  20.                         if(count==3)
  21.                         {
  22.                                 a[i]=0;
  23.                                 num--;
  24.                                 count=0;
  25.                         }
  26.                 }
  27.         }
  28.         for(i=1;i<n;i++)
  29.         {        if(a[i]!=0)
  30.                 printf("%d\n",i);
  31.         }
  32.                
  33. }
  34.                

复制代码


运行结果:
请输入猴子数量=5
Press any key to continue

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 22:00:17 | 显示全部楼层

int 后面的count没赋值为0,也可以吗???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 22:17:51 | 显示全部楼层
jackz007 发表于 2021-12-22 22:18
就是约瑟夫环问题

        编译、运行实况:

我以为是卡死了,原来是运算的慢,等了老半天才出来结果,但如果把count=0,加上,就立马出来了结果,
还有一点不明白,为什么把每个for里的i=0改为i=1;再把最后的输出i+1改为i,
运行结果就这样了:
5
Press any key to continue                 5是输入猴子数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 22:19:08 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 02:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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