转圈报数问题
#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之后卡住不动了 这是一个经典的转圈报数问题,解法如下:
#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官方接口),如未能正确解答您的问题,请继续追问。 FishC_GPT 发表于 2023-11-26 20:00
这是一个经典的转圈报数问题,解法如下:
我的代码错在哪你能告诉我吗 伴学终生 发表于 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]