约瑟夫问题C++实现

   
  //***************************  
  //**         Josephus
问题解法1     **  
  //**         jose1.cpp                     **  
  //***************************  
   
  #include   <iostream.h>  
   
  void   main()  
  {  
      //
建立小孩数组  
      const   int   num=10;         //
小孩数  
      int   interval;                 //
每次数interval个小孩,便让该小孩离开  
      int   a[num];                     //
小孩数组  
      //
给小孩编号  
      for(int   i=0;   i<num;   i++)       //
小孩的编号只与小孩数有关  
          a[i]=i+1;  
      //
输入数小孩间隔  
      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've   won./n";         //
输出胜利者  
  }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值