设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。假设除去第k个人,则 0, 1, 2, 3...
int a[30]={0};printf("请输入有几个人玩游戏:");scanf("%d",&n);for(i=0;i<n;i++){ a=1;//1代表活着,0代表出局 } for(i=1;i<4;i=i%3+1)//控制i的值在[0,3]{ if(3==i&&a[j]!=0){ a[j]=0;printf("%d号玩家出局\n",j+1);k++;if(n-1==k)break;j...
j++;if(j==m){printf("%d\n",a[i]);out++;j=0;a[i]=0;} /*依次打印退出人的编号*/ if(i==n-1) break;} } i=0;if(a[i]!=0){printf("%d",a[i]);i++;} /*最后打印剩下一人的编号*/ } 请采纳
include<stdio.h>void main(){ int i,k,m,n,num[50],*p; printf("请输入人数n="); scanf("%d",&n); p=num; for(i=0;i<n;i++) *(p+i)=i+1; i=0; k=0; m=0; while(m<n-1) { if(*(p+i)!=0) k++; if(k==5) { *(p+i)=0; k=0; ...
1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问题: 报到T的人出圈,怎么表示出圈?要么删除对应的标号,其他的标号前移(如果是数组结构,要依次移动元素,效率低;如果是链表,删除结点也比较麻烦);要么...
void main(){ int i = 0;int n = 0;int out = 0; //退出的人数 int num = 0; //报数 int a[1024] = {0}; //0表示退出圈子 printf("Input n:");scanf("%d", &n);for (i = 0; i < n; i++){ a[i] = 1;} i = 0;while (out != n-1){ if (a[i] == ...
void main(){ int a[N]={0},i=0,out_n=0,call_n=0,*p;p=a;while(1){//循环报数 if(*p==0){//如果健在 if(out_n==(N-1))break;//如果仅剩一人 call_n++;//报数 call_n%=3;//最大为3,到了3就从0开始 if(call_n==0){*p=1;out_n++;}//为0(即3)出局 } p++...
int main(int argc,char *argv[]){ int a[20],b[20],i,j,t,n,m;printf("Enter n(int 0<n,m<21)...\nn m = ");if(scanf("%d%d",&n,&m)==2 && n>0 && n<21 && m>0 && m<21){ for(i=0;i<n;a[i++]=i+1);//创建人员编号 i=-1,j=t=0;printf("\n...
if(n>=MAX||n<m||n<1||m<1){ printf("您的输入不符合要求!\n");return;} for(i=1;i<=n;i++)//开始赋值 初始化 { a[i]=i;} length=n;//初始化 i=1;k=1;while(1){ if(a[i]>0){ if(length==1){ break;} if(k>=m){ a[i]=0;k=1;length--;} else//k<...
count=0; //此处导致count永远只能是0或1所以out的值不会变 把这儿的p++删了 p++; while就成死循环了 if(*p==a[n-1]) 把这个if语句嵌套到if(*p!=0)里的p++后面这儿不要了 p=a;} printf("%d",*p);} return 0;} 这样改完后应该能把最后剩下的号码打出,其实可以把出...