伴学终生 发表于 2023-11-26 20:00:12

转圈报数问题

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(){
    int n=0,count=0,s=0;//n:剩余的数    count:累加的数   s:一直往后推
    scanf("%d",&n);
    int *p=(int *)malloc(n*sizeof(int));
    for(int i=0; i<n; i++){
      p=1;
    }
    while(n>1){
      s=s%n;//循环队列
      if(p==1){
            count++;//发现未被移除数
            if(count%3==0){
                p=0;
                n--;//总人数--
            }
      }
      s++;//坐标往后移
    }
    for(int i=0;i<n;i++){
      if(p==1){
            printf("留下的学生是:%d",i+1);
      }
    }
}


我感觉逻辑没什么错误,但是输入7之后卡住不动了

FishC_GPT 发表于 2023-11-26 20:00:26

这是一个经典的转圈报数问题,解法如下:

#include <stdio.h>
#include <stdlib.h>

int main(){
    int n=0,count=0,s=0;
    scanf("%d",&n);
    int *p=(int *)malloc(n*sizeof(int));
   
    // 初始化数组
    for(int i=0; i<n; i++){
      p = 1;
    }
   
    while(n>1){
      s=s%n;
      if(p == 1){
            count++;
            if(count%3==0){
                p=0;
                n--;
            }
      }
      s++;
    }
   
    for(int i=0;i<n;i++){
      if(p == 1){
            printf("%d",i+1); // 输出最后剩下的数的位置
            break;
      }
    }
   
    free(p);
    return 0;
}

代码逻辑解释:
1. 输入人数n;
2. 动态分配一个长度为n的整型数组,用来表示是否被移除,初始值都设为1;
3. 使用循环队列的思路,循环处理每个位置;
4. 如果该位置对应的数没有被移除,则计数器count加1;
5. 如果count是3的倍数,则将该位置对应的数设为0,并将总人数减1;
6. 循环完毕后,在数组中找到唯一一个值为1的位置,并输出该位置加1。

希望能帮助到你!

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

伴学终生 发表于 2023-11-26 20:02:49

FishC_GPT 发表于 2023-11-26 20:00
这是一个经典的转圈报数问题,解法如下:



我的代码错在哪你能告诉我吗

FishC_GPT 发表于 2023-11-26 20:03:12

伴学终生 发表于 2023-11-26 20:02
我的代码错在哪你能告诉我吗

您的代码有几个小问题,我来指出并进行修改:

1. 首先,在使用动态内存分配函数`malloc()`分配内存时,应该检查分配是否成功。可以使用`if(p == NULL)`来判断是否分配成功,如果失败则需要进行适当的处理。

2. 其次,在循环报数过程中,您定义的循环变量`i`没有被使用。在每次循环中,应该根据当前的`s`值获取对应的数组元素进行判断和操作。

3. 第三,在输出最后剩余的数字时,您缺少了打印语句`printf("%d\n", p);`。

根据以上问题,以下是修正后的代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 0, count = 0, s = 0;
    scanf("%d", &n);

    // 分配动态内存,并检查分配是否成功
    int *p = (int *)malloc(n * sizeof(int));
    if (p == NULL) {
      printf("内存分配失败\n");
      return 0;
    }

    // 初始化数组
    for (int i = 0; i < n; ++i) {
      p = 1;
    }

    while (n > 1) {
      s = s % n;

      if (p == 1) {
            count++;
            if (count % 3 == 0) {
                p = 0;
                n--;
            }
      }

      s++;
    }

    for (int i = 0; i < n; ++i) {
      if (p == 1) {
            printf("最后剩下的数字是:%d\n", i + 1);
            break;
      }
    }

    // 释放动态分配的内存
    free(p);

    return 0;
}

这样,代码应该就可以正确执行转圈报数问题了。注意,在使用动态内存分配函数`malloc()`后,一定要记得使用`free()`函数释放对应的内存空间,以避免内存泄漏问题。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 转圈报数问题