有n个人围成一圈,并按一定顺序排号.从第一个人开始报数(从1到3),凡是报到3的人退出圈子,问最后留下的是原来第几号的那位?
(注意:请用c++做,如果有做上的朋友请把答案发到我的邮箱或者给我留意,谢谢了!!!)
哈哈,你太幸运了, 刚好这个题目在我的电脑上存有。
[CODE]#include<iostream.h>
//using namespace std;
void main()
{
//建立小孩数组
const int num=10;/*小孩数*/
int interval;/*每次数 interval 个小孩,便让小孩离开*/
int a[num];/*小孩数组*/
/*给小孩编号*/
for(int i=0;i<num;i++)/*小孩的编号只与小孩数相关*/
a[i]=i+1;/*1至10个小孩*/
/*输入数小孩间隔*/
cout<<"Please input the interval:";/*输入一个数小孩个数*/
cin>>interval;
/*将全体参加的小孩输出*/
for(int i=0;i<num;i++)/*顺序输出开始时的小孩编号*/
{
cout<<a[i]<<",";
cout<<endl;
int k=1;/*标识处理第K个离开的小孩*/
int i=-1;/*数组下标(下一个值0就是第一个小孩的下标*/
//处理获胜前的小孩
while(1)
{
//在圈中数interval个小孩
for(int j=0;j<interval;)
{
i=(i+1)%num;/*对下标加1求模*/
if(a[i]!=0)/*如果该元素的小孩在圈中,则承认数数有效*/
j++;
}
if(k==num) break;/*该小孩是最后一个(胜利者)吗?*/
cout<<a[i]<<",";/*输出离开的小孩之编号*/
a[i]=0;/*标识小孩已离开*/
k++;/*准备处理下一个圈中的小孩*/
}
/*break语句跳转到这里*/
cout<<"\nNo."<<a[i]<<"Boy's won.\n";/*输出胜利者*/
}
}[/CODE]