约瑟夫 问题

约瑟夫问题

这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:
15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:
30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。

 

代码实现:

#include<iostream>
using namespace std;
void Yueshefu(int a[], int Num, int k)  //Num为数组元素个数,k为每次查找的间隔数
{
 int i = 0;
 int j = 0;
 int n = 0;   //计数
 for(i = 0; i < Num; i++)
 {

      if (1 == a[i])
     {
       j += 1;
          if (j == k)
         {  
          a[i] = 0;
          cout<<i+1<<"    ";
          j = 0;
          n++;
         }
         if(n == 15) //查找15次就结束查找,跳出循环
         {
             break;
         }
         if (i == (Num-1))
   {
          i = -1;
   }
     }
  }
}
int main()
{
 int a[30] = {0};
 int i = 0, j = 0;
 for (i = 0; i < 30; i++)
 {
    a[i] = 1;
 }
 cout<<"将非教徒安排在下列位置:"<<endl;
    Yueshefu(a, 30, 9);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值