dinghuang 发表于 2024-10-25 20:19:31

有n个人围成一圈(编号为0~n-1),从第0号的人开始从1报数,凡报到3的倍数的人离...

#include<stdio.h>
int main()
{
        int arr,i,n,result=0,number=0,index=0;
        scanf("%d",&n);
        int count=n;
        for(i=0;i<n;i++)
        {
                arr=1;
        }
        while(count>1)
        {
                for(index=0;index<n;index++)
                {
                        if(arr==1)
                        {
                                number++;
                        }
                        if(number%3==0)
                        {
                                        arr=0;
                                        count--;
                        }
                }
               
        }
        for(i=0;i<n;i++)
        {
                if(arr==1)
                {
                        printf("%d\n",i);
                }
        }
        return 0;
}哪里错了

FishC 发表于 2024-10-25 20:23:59

看起来您想实现一个报数出圈的问题。这个问题通常被称为“约瑟夫环问题”。我将为您提供一个完整的解决方案:

#include <stdio.h>

int main() {
    int n, k = 3; // 设定k为3,表示每次报到3的人出圈
    int count, index = 0, step = 0;
    scanf("%d", &n);
    count = n;

    // 初始化一个数组来表示是否出圈
    int arr;
    for (int i = 0; i < n; i++) {
      arr = 1; // 1表示在圈中,0表示已出圈
    }

    while (count > 1) { // 当圈中人数大于1时继续循环
      if (arr == 1) { // 如果当前编号的人还在圈中
            step++;
            if (step == k) { // 判断是否报到3
                arr = 0; // 出圈
                count--; // 圈中人数减少
                step = 0; // 重置计数
            }
      }
      index = (index + 1) % n; // 移到下一个人,形成一个环
    }

    // 输出最后一个留下的人的编号
    for (int i = 0; i < n; i++) {
      if (arr == 1) {
            printf("最后留下的人是: %d\n", i);
            break;
      }
    }

    return 0;
}

### 代码解释:
1. **初始化数组**:我们用一个数组`arr`来标记每个人是否在圈中。
2. **循环报数**:我们执行一个循环,当只剩下一个人时结束。
3. **判断出圈条件**:每次报数到3时,让对应的人出圈。
4. **调整索引**:使用`index = (index + 1) % n`实现环状遍历。
5. **输出结果**:当只剩一个人时输出该人的编号。

这样,这段代码会找出最后留在圈中的人的编号。希望这个答案能帮助到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

dinghuang 发表于 2024-10-25 20:32:37

number%3==0我想的是number一直增加找到序号对应的数是三的倍数为啥运行出来的有好几个答案

FishC 发表于 2024-10-25 20:32:48

dinghuang 发表于 2024-10-25 20:32
number%3==0我想的是number一直增加找到序号对应的数 ...

你的思路是对的,可以通过计数来找出三的倍数的人。问题可能出在计数和标记上的逻辑不完整。我来优化一下代码:

#include <stdio.h>

int main() {
    int n, number = 0, index = 0;
    scanf("%d", &n);

    // 初始化一个数组来表示是否出圈
    int arr;
    for (int i = 0; i < n; i++) {
      arr = 1; // 1表示在圈中
    }

    int count = n; // 记录圈中人数

    while (count > 1) {
      if (arr == 1) { // 如果当前编号的人还在圈中
            number++;
            if (number % 3 == 0) { // 判断是否为三的倍数
                arr = 0; // 出圈
                count--; // 圈中人数减少
            }
      }
      index = (index + 1) % n; // 移到下一个人,形成一个环
    }

    // 输出最后一个留下的人的编号
    for (int i = 0; i < n; i++) {
      if (arr == 1) {
            printf("最后留下的人是: %d\n", i);
            break;
      }
    }

    return 0;
}

### 代码说明:
1. **数组初始化**:`arr = 1`表示该人还在圈中。
2. **循环条件**:在圈中人数大于1时继续执行。
3. **计数和判断**:使用`number % 3 == 0`找出应出圈的人。
4. **循环移动**:`index = (index + 1) % n`确保在圈内循环。

这样可以确保每次只找出一个三的倍数,且每次报数正确处理。最后输出唯一一个留在圈中的人的编号。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

dinghuang 发表于 2024-10-25 20:54:52

FishC 发表于 2024-10-25 20:32
你的思路是对的,可以通过计数来找出三的倍数的人。问题可能出在计数和标记上的逻辑不完整。我来优化一 ...

好的知道错哪了谢谢

FishC 发表于 2024-10-25 21:02:06

dinghuang 发表于 2024-10-25 20:54
好的知道错哪了谢谢

不客气!看得出您对问题有很好的理解,只是代码实现上稍有瑕疵。如果还有其他相关的问题或需要进一步优化代码,请随时询问。加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

yhlzc2024 发表于 2024-10-25 21:21:00

学习学习

jackz007 发表于 2024-10-26 01:14:31

本帖最后由 jackz007 于 2024-10-26 01:35 编辑

      这些代码
                for(index=0;index<n;index++)
                {
                        if(arr==1)
                        {
                              number++;
                        }
                        if(number%3==0)
                        {
                                        arr=0;
                                        count--;
                        }
                }
         应该改为:
                for(index=0;index<n;index++)
                {
                        if(arr==1)
                        {
                              number++;
                              if(number%3==0)
                              {
                                        arr=0;
                                        count--;
                              }
                        }
                }


      以下是我写的代码,谨供楼主参考:
#include <stdio.h>

int main(void)
{
      int arr , c , i , k , n            ;
      printf("n : ")                           ;
      scanf("%d" , & n)                        ;
      for(i = 0 ; i < n ; i ++) arr = 1       ;
      for(c = i = 0 , k = n ; k > 1 ; i ++) {
                if(arr) {
                        c ++                     ;
                        if(c == 3) {
                              arr = 0   ;
                              k --               ;
                              c = 0            ;
                        }
                }
      }
      for(i = 0 ; i < n ; i ++) if(arr) break ;
      printf("%d\n" , i + 1)                     ;
}
页: [1]
查看完整版本: 有n个人围成一圈(编号为0~n-1),从第0号的人开始从1报数,凡报到3的倍数的人离...