c语言:有n个人围成一圈,顺序排号。从第一个人开始报数(从1~3报数),报到3的人退出圈子,求退出顺序

题目就是这样,求解答

#define n 100; //这里你随便改。

int result[n]; //这个数组用来存放结果,为了一一对应,n个人里,第一个的序号是0,不是我们习惯采用的1。

int flag[n]; //这个数组用来标记这个n个人的状态,一一对应,报过3的所对应的标记为1,否则0。
所以初始化话时,flag里面都为0。
for(int i = 0; i < n; i++) flag[i] = 0;

当数组flag里面所有的元素都为1的时候,也就是flag的和为n时,表示计算完成了。
为了使调理清晰先做一个子函数bool sumFlag()
bool sumFlag()
{
int sum =0;
for(int i = 0; i < n; i++)
sum = sum + flag[i];
if(sumFlag == n) return false;
else return ture;
}

下面开始运算

int currentNumber = 1; //这个变量用于记录报数值。
int index = 0; //这个变量用于记录写入result的索引号。其实也可以用这个值来判断是否完成了计算。

while(sumFlag()) //当flag里面不全是1的时候,进行下面的操作,否则结束。
{
for(int i = 0; i < n; i++) //每次都从0到n-1遍历,正如上文提到为了一一对应,n个人里,第一
//个的序号是0,不是我们习惯采用的1。所以第n个是n-1。
{
if((flag[i] == 0) //每次遍历的时候,先检查这个人对应的标记是否为0?如果是1就跳
// 过。
{
if(currentNumber == 3) //标记是0,报的数又是3,那开始记录这个位置。
{
result[index] = i;
index++; //记录完位置后,要把下一次填入result的索引增加。
currentNumber = 1; //报数又回到1。
}
else currentNumber++; //当前报数不是3,则要么是1,要么是2,直接增加报数值。
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-09
#include<stdio.h>
int main()
{
    int maxn = 100;
    int a[maxn];
    memset(a, 0, sizeof(a));

    int N=17, M = 3;
    int count = 1;
    int rest = N, j, i;
    for (i = 0; i < N; i = (i + 1) % N)
    {
        if (a[i] == 0)
        {
            if (count == M)
            {
                a[i] = 1;
                printf("%d ", i+1);
                rest--;
                if (rest == 0)
                    break;
                count = 1;
            }
            else
                count++;
        }
    }
}

第2个回答  2013-12-09

不能调试,不知道对不对,不过想来没有问题,你试试

#include"iostream.h"
void main()
{
int i,n,*a;
cout<<"人数:";
cin>>n;
a=new int[n];
for(i=0;i<n;)
a[i]=++i;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
int mk,change,num;//mk为报数标记,change储存报数三的人编号,num为已出列人数
for(mk=1,i=0,num=0;num<=n;i++){
if(i==n)
i=num;
if(mk==3){
change=a[i];
for(int j=i;j>=num;j--){
a[j]=a[j-1];
a[num-1]=change;
}
num++;
mk=0;
}
mk++;
}
for(i=0;i<n;i++)
cout<<a[i]<<" ";
delete[] a;
}

第3个回答  2013-12-09
讲一下基本思路,
定义一个数组,先全部归零。
然后处理,当零的时候没有退出,1的时候推出知道推出到最后一个
核心代码
int a[1000], n, i, num=1, index=0,flag=1;
scanf("%d", &n);
memset(a, 0, sizeof(a));
while(num!=n+1)
{
if(index[i]==0)

else
{
if(flag==3) {a[index]=num;flag=0; num++;}
else flag++;
}
index++;index%=n;
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<n;j++)
if(a[j]==i) printf("%d ", j);
}
printf("\n")本回答被提问者和网友采纳
相似回答