主题:[讨论]各位大侠,请帮小弟,看下这个题目怎么做。
xuexiziji
[专家分:90] 发布于 2006-04-11 16:16:00
有n个人围成一圈顺序排列,从第一个人开始报数(从一到3报数),凡报到3的人退出圈子问最后留下的是原来的第几号的那位。
回复列表 (共5个回复)
沙发
wanggcc [专家分:1450] 发布于 2006-04-11 17:14:00
呵呵,这个复杂了,一时转不过弯来
板凳
海上飞洪 [专家分:520] 发布于 2006-04-11 17:35:00
C语言课本后面的练习里面就有这题哦
3 楼
euc [专家分:4310] 发布于 2006-04-11 17:40:00
搜索"约瑟夫环"
4 楼
a566520 [专家分:30] 发布于 2006-04-20 17:21:00
#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 楼
flysun0311 [专家分:2040] 发布于 2006-04-20 18:07:00
#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;
}
应该在这个上面有很多这样的例子.
我来回复