这个问题的背景是一个犹太人的故事,故事好听,但问题不好解决,做的一塌糊涂,特此留念。
#include <iostream.h>
#include <iomanip.h>
void main()
{
int rs;//总人数
cout<<"请输入要进行选择的总人数(不要超过1000)"<<endl;
cin>>rs;
int a[1000];//定义一个较大的数组
int num;//定义第一个被淘汰的人的数字
cout<<"请输入要被淘汰的第一个人数字编号"<<endl;
cin>>num;
int x;
cout<<"请输入最后要剩下的人的个数:"<<endl;
cin>>x;
cout<<"全部人员编号依次为:"<<endl;
for(int i=0;i<rs;i++)
{
a[i]=i+1;
cout<<setw(4)<<a[i];
}
cout<<endl;//给数组中的元素赋值
int n=-1;//n值为-1是为了让经过变化后的n第一次初值为0可以对应第一个数组元素下标
cout<<"被淘汰的人编号依次为:"<<endl;
for(int j=0;j<rs-x;j++)//最后剩下x个因此要循环rs-x次
{
for(int k=0;k<num;)//循环选出符合条件的元素
{
n=(n+1)%rs;//实现从循环尾部到循环头部的跳跃
if(a[n]!=0)//排除无效元素,即0
{
k++;
}
}
cout<<setw(4)<<a[n];//输出符合条件的数组元素值
a[n]=0;//将已经挑选出来的数组元素改为0标记成无效元素
}
cout<<endl<<"最后的剩下的人数字编号为:"<<endl;
for(int y=0;y<rs;y++)//循环比较值不为0的即为最后剩下的
{
if(a[y]!=0)
cout<<setw(4)<<a[y];
}
cout<<endl;
}