鱼C论坛

 找回密码
 立即注册
查看: 1006|回复: 3

[已解决]转圈报数问题

[复制链接]
发表于 2023-11-26 20:00:12 | 显示全部楼层 |阅读模式

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

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

x
#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[i]=1;
    }
    while(n>1){
        s=s%n;//循环队列
        if(p[s]==1){
            count++;//发现未被移除数
            if(count%3==0){
                p[s]=0;
                n--;//总人数--
            }
        }
        s++;//坐标往后移
    }
    for(int i=0;i<n;i++){
        if(p[i]==1){
            printf("留下的学生是:%d",i+1);
        }
    }
}


我感觉逻辑没什么错误,但是输入7之后卡住不动了
最佳答案
2023-11-26 20:03:12
伴学终生 发表于 2023-11-26 20:02
我的代码错在哪你能告诉我吗

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

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

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

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

根据以上问题,以下是修正后的代码:
#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[i] = 1;    }    while (n > 1) {        s = s % n;        if (p[s] == 1) {            count++;            if (count % 3 == 0) {                p[s] = 0;                n--;            }        }        s++;    }    for (int i = 0; i < n; ++i) {        if (p[i] == 1) {            printf("最后剩下的数字是:%d\n", i + 1);            break;        }    }    // 释放动态分配的内存    free(p);    return 0;}
这样,代码应该就可以正确执行转圈报数问题了。注意,在使用动态内存分配函数`malloc()`后,一定要记得使用`free()`函数释放对应的内存空间,以避免内存泄漏问题。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i] = 1;    }        while(n>1){        s=s%n;        if(p[s] == 1){            count++;            if(count%3==0){                p[s]=0;                n--;            }        }        s++;    }        for(int i=0;i<n;i++){        if(p[i] == 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官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-26 20:02:49 | 显示全部楼层
FishC_GPT 发表于 2023-11-26 20:00
这是一个经典的转圈报数问题,解法如下:

我的代码错在哪你能告诉我吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-26 20:03:12 | 显示全部楼层    本楼为最佳答案   
伴学终生 发表于 2023-11-26 20:02
我的代码错在哪你能告诉我吗

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

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

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

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

根据以上问题,以下是修正后的代码:
#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[i] = 1;    }    while (n > 1) {        s = s % n;        if (p[s] == 1) {            count++;            if (count % 3 == 0) {                p[s] = 0;                n--;            }        }        s++;    }    for (int i = 0; i < n; ++i) {        if (p[i] == 1) {            printf("最后剩下的数字是:%d\n", i + 1);            break;        }    }    // 释放动态分配的内存    free(p);    return 0;}
这样,代码应该就可以正确执行转圈报数问题了。注意,在使用动态内存分配函数`malloc()`后,一定要记得使用`free()`函数释放对应的内存空间,以避免内存泄漏问题。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 07:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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