望山河揽星月 2021-04-21 14:37 采纳率: 0%
浏览 114

30个人(编号为0~29)围成一圈,从第0号开始报数1,凡报到n(n为输入数据,n>=1)的人离开圈

30个人(编号为0~29)围成一圈,从第0号开始报数1,凡报到n(n为输入数据,n>=1)的人离开圈子,后面的人再从1开始报数,照此进行下去,最后留下的为原来第几号?要求用一维数组实现算法,输出最后留下的1个人的数组下标。 #include "stdio.h" int main() { int a[30]={1},m,n,i,r; scanf("%d",&m); for(n=30,r=0;n!=1;) {for(i=0;i29) r=r-30; if(a[r]!=0) i++;} a[r-1]=0; n=n-1; } for(r=0;a[r]!=0;r++); printf("%d",r); } 大佬指教一下 我写的哪里有问题吗
  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-07-15 09:34
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    你的代码中存在一些问题,我来帮你指出并改正:
    1. 在初始化数组a时应该为a[30] = {0};,表示30个人都还在圈子里。
    2. 在for循环中n应该初始化为29,而不是30,因为初始情况下有30个人在圈子里。
    3. 在内层的for循环中,应该把r++的操作放在if的外面,以确保每次循环都要进行r++操作。
    4. 最后寻找留下的那个人时,应该是a[r]为1的时候,而不是a[r]不为0。因为数组a中标记的是第i个人是否离开圈子,为0表示离开了,为1表示还在圈子里。
    5. 最后输出的时候应该是r+1,因为数组下标是从0开始的。 综上所述,修改后的代码如下:
    #include "stdio.h"
    int main() {
        int a[30] = {0}, m, n, i, r;
        
        scanf("%d", &m);
        n = 29;
        
        for(r = 0; n != 1;) {
            for(i = 0; i < m; r++) {
                if (r >= 30) r -= 30;
                if (a[r] == 0) i++;
            }
            
            a[r-1] = 1;
            n--;
        }
        
        for(r = 0; a[r] != 1; r++);
        
        printf("%d", r + 1);
        
        return 0;
    }
    

    希望这个改进后的代码能够帮助你解决问题。如果还有其他疑问,欢迎继续提问。

    评论

报告相同问题?