C语言数组相关问题

来源:百度知道 编辑:UC知道 时间:2024/06/06 09:25:02
如下例题:
S个人围成一个圈,从第0个同学开始报数,报道n时该人退出圈,问最后一个人的号码
请问此题思路
能有程序代码最好
谢谢

经典的猴子选大王算法设计:

猴子选大王模块设计思路及算法
1 设计思路:
用monkeynum(1<=i&&i<=m)代表猴子的状态,当猴子都在圈中时monkeynum =1,不在圈中monkeynum =0, i 代表猴子的编号!count1用来计算在圈中猴子的数目,m为猴子数,n为循环数,当从1数到n时,将monkeynum[n]置0,相当于把编号为n的猴子删除,接着从下一个猴子以1继续数,当数到n时,假若此时猴子编号为i,则将monkeynum=0,相当于把编号为i的猴子从圈中删除!直到圈中猴子的个数count1=1,结束循环,
最后输出猴子编号!
2. 大概算法
大概算法如下所示:
void monkey_choose_king(){//选大王程序
for(int j=1;j<=m;j++)
monkeynum[j]=1; // 初始化时猴子都在圈中(1表示在圈中,0 表示不在)
while(1){
i++;
if(i>m) i=1;//i大于猴子数将i=1
count=count+monkeynum;
if(count==n){
count=0; monkeynum=0; //被数到的猴子从圈中删除,
for(j=1;j<=m;j++)
cout<<monkeynum[j]<<" ";// 输出选大王过程
cout<<endl;
}
for(j=1;j<=m;j++){
if(monkeynum[j]==1) count1=count1+1;
if(count1>1) break;//检测圈中还剩的猴子数count1
}
/*如果圈中只有1个猴子(count1=1),输出其编号,结束while循环,
否则,大于1个(count1>1)继续数*/
if(count1==1) {
for( j=1;j<=m;j++)
{