回 帖 发 新 帖 刷新版面

主题:[讨论]各位大侠,请帮小弟,看下这个题目怎么做。

有n个人围成一圈顺序排列,从第一个人开始报数(从一到3报数),凡报到3的人退出圈子问最后留下的是原来的第几号的那位。

回复列表 (共5个回复)

沙发

呵呵,这个复杂了,一时转不过弯来

板凳

C语言课本后面的练习里面就有这题哦

3 楼

搜索"约瑟夫环"

4 楼

#include<iostream>
using namespace std;
main()
{
 int a[10]={1 , 2,3,4,5,6,7,8,9,10},i,p=0;
for(i=0;i<100;i++)
   {
     if(a[i%10]!=0)
        p++;
     if(p%3==0)
       a[i%10]=0;
     if(p/27==1)
       break;
    }
 for(i=0;i<10;i++)
  if(a[i]!=0)
  cout<<a[i];
return 0;
}
思路:
用一个FOR循环来循环100次,当a[i%10]!=0时让P加1,I%10的作用是使循环到末端时能回到起点,当P为3或3的倍数时,使当前的A[I%10]的值变为0,当P整处27时跳出循环,即数组中有9个数变为0,最后输出这个数~~我这里是以10个数为列~~多的话自己把相应的地方改了就行了

5 楼

#include<iostream>
using namespace std;
#define N 100
void main()
{
    int num=0,i,j=0,k=0;
    cout<<"报数退圈,从一报到三,第三号退出"<<endl;
    cout<<"请输入人数"<<endl;
    cin>>num;
    int a[N]={0};
    for(i=0;i<num;i++)
        a[i]=1;
    while(k<num-1)
    {
        for(i=0;i<num;i++)
        {
            if(a[i]==1)
            {
                j++;
                if(j==3)//报到三
                {
                    a[i]=0;
                    k++;//记录退出的人数
                    j=0;
                }
            }
        }
    }
    for(i=0;i<num;i++)//
        if(a[i]==1)
            cout<<"最后剩下的为 "<<i+1<<"号"<<endl;

应该在这个上面有很多这样的例子.

我来回复

您尚未登录,请登录后再回复。点此登录或注册