Josephus问题

这个问题的背景是一个犹太人的故事,故事好听,但问题不好解决,做的一塌糊涂,特此留念。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值