首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

”n个人围城一圈,依次报1,2,3,然后报3的人推出,求最后留上来的是第几号“的有关问题

2013-02-18 
”n个人围城一圈,依次报1,2,3,然后报3的人推出,求最后留下来的是第几号“的问题这个问题最后留下来的不是有

”n个人围城一圈,依次报1,2,3,然后报3的人推出,求最后留下来的是第几号“的问题
这个问题最后留下来的不是有两个吗?
编号从1 开始的话,1号肯定留下吧!那用下面这个程序 ,每次都是 结果都是1 !
----------

# include <stdio.h>

int main ()
{
    int num[100],*p,n,m/*退出的人数*/,i/*每次循环的计数器*/,k/*按1,2,3时的计数器*/;
    //确定人数;
printf ("input the number of person,n=");
scanf ("%d",&n);
i=0;      //初始化;
k=0;
m=0;
//对每个人进行编号;
p=num;

for (i=0;i<n;i++)
{
    *(p+i)=i+1;    
}
while (m<n-1)     
{
    if (*(p+i)!=0)
{
k++;
}
if (3==k)
{
    *(p+i)=0;        //将退出的人的编号置为0;
k=0;
m++;
}
i++;
if (n==i)
{
    i=0;
}

}

while (*p==0) 
{
 p++;
}
printf ("The last one is no.%d\n",*p);
    return 0;
}

[解决办法]
哦你下标是0开始。那就是i没有初始化为0。进入while的时候i一开始就是n,后面就全乱了。
[解决办法]
仅供参考
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
    while (1) {
        printf("Input n m(1000>=n>=m>=1):");
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d%d",&n,&m)) {
            if (1000>=n && n>=m && m>=1) break;
        }
    }
    t=0;//已出圈总人数
    i=1;//座位编号
    k=1;//当前要数的数
    while (1) {
        if (0==f[i]) {
            if (m==k) {
                t++;
                f[i]=1;
                printf("%3d ",i);
                if (0==t%10) printf("\n");
                if (t>=n) break;
            }
            k++;if (k>m) k=1;
        }
        i++;if (i>n) i=1;
    }
    cprintf("Press any key ...");
    getch();
}

热点排行