约瑟夫问题:n个人围成一圈,初始编号从1~n排列,从约定编号为x的人开始报数,数到第m个人出圈,接着又从1开始报数,报到第m个数的人又退出圈,以此类推,最后圈内只剩下一个人,这个人就是赢家,求出赢家的编号。
#include<iostream>
#include<stdio.h>
using namespace std;
void init(int n[],int len){
for(int i=0;i<len;i++){
n[i]=1;
}
return ;
}
int main(){
int m,n;
while(scanf("%d%d",&n,&m)!=EOF){
if(m==0&&n==0) break;
int flag[301]={1};
int cnt=n;//记录剩下猴子数
int j=0;
while(m!=0&&n!=0){
init(flag,n+1);
for(int i=1;i<=n;i++){
if(flag[i]==1){
j++;
if(cnt==1) {
cout<<i<<endl;
return 0;//与break;的矛盾
}
if(j==m){
flag[i]=0;
cnt--;
j=0;
}
}
}
}
}
return 0;
}
问题:只能输入一组数据,不能用return ,应该用break;
flag[]不完全初始化时,其余数初始化为0;
正解
#include<iostream>
#include<stdio.h>
using namespace std;
void init(int n[],int len){
for(int i=0;i<len;i++){
n[i]=1;
}
return ;
}
int main(){
int m,n;int flag[301];
while(scanf("%d%d",&n,&m)!=EOF){
if(m==0&&n==0) break;
int cnt=n;//记录剩下猴子数
int j=0;int i=0;
init(flag,n+1);
for(i=1;;){
//猴子从1数到 m
if(flag[i]==1){
j++;
if(cnt==1) {
cout<<i<<endl;
break;//与break;的矛盾
}
if(j==m){
flag[i]=0;
cnt--;
j=0;
}
}
i++;
if(i==n+1) i=1;//不必写成1-n 的循环
}
}
return 0;
}
数组参数
void init(int n[],int len) //注意n []的顺序