josephus问题
#include <iostream.h>
void main()
{
//建立小孩数组
const int num=10 ; // 定义常量 小孩数为10
int interval; // 定义每次数interval 个小孩,便让该小孩离开
int a[num] ; // 定义小孩数组
//给小孩编号 顺序编为 1,2,3,…,10
for(int i=0; i<num; i++)
a[i]= i+1; //小孩从1号开始编
//输入数小孩的间隔
cout<<"please input the interval:" ; //输入一个间隔数
cin>>interval;
//将全体参加的小孩输出,用于比较
for( i=0; i<num; i++) //输入全体小孩的编号
cout<<a[i]<<",";
cout <<endl;
int k=1 ; //标识处理第k个离开的小孩
i=-1 ; //数组下标(下一个值0就是一个小孩的下标) (注:在VC++中 int k=1;int i=-1是错的)
//处理获胜前的小孩
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"; //输出胜利者
}
c++执行结果:
please input the interval: 5
1,2,3,4,5,6,7,8,9,10,
5,10,6,2,9,8,1,4,7,
No.3boy's won.
Press any key to continue
int k=1 ; //标识处理第k个离开的小孩
i=-1 ; //数组下标(下一个值0就是一个小孩的下标) (注:在VC++中 int k=1;int i=-1是错这仍然不懂,这是干什么用的?i=(i+1)%num; //对下标加1求模,(其实只是针对头和尾的)
if(a[i]!=0) //如果该元素的小孩在圈中,则承认数数有效
j++;
这一段也不懂,怎么看怎么理解不了,真是头疼了,加一求模是什么意思了?