解题思路:
题目重述: 约瑟夫环问题是一个自杀问题。
①在n个人情况下,从1~m报数,凡报到m即退出自杀。
②再次从1(第m+1个) 开始报数,再次报到m(m+m),退出自杀。
③ 依次循环...........
图解思路:
设有7个人,即a[7],1~3报数。
报到3,就出局!!!
蓝色为剩余结果,标红3为出局人。
a[7] 0 1 2 3 4 5 6
第一轮 1 2 3 1 2 3 1
结果: 0 1 3 4 6
第二轮 2 3 1 2 3
结果: 0 3 4
第三轮 1 2 3
结果: 0 3
第四轮 1 2
结果: 0 3
第五轮 3 1
结果: 3
注意:结果是3,但位置是4,数组从0开始
思路:
①设置数组a[n],a[i]为0表示未出局,为1表示出局;
②设置dh,用于记录已出局人数,用于退出出局循环;
③设置mouth,用于记录报数1~n,每当出局一个人,mouth重新置为1,重新报数;
④当a[i]!=1时,即最后一个未出局人。
参考代码:
#includeint main() { int n; scanf("%d",&n); int a[n]; for(int i=0;i<n;i++) a[i]=0; //输入n,并将a[]置为0 int dh=0; int mouth=1; //设置退出循环条件,报数初值 int i=0; while(1){ //无限循环,除非遇break if(dh==n-1)break; //n-1即只剩最后一人,退出循环 if(a[i]==1)i++; //已经出局的人,不做计算,即不报数 else { if(mouth==3){ //满足出局条件 a[i]=1; //标记为出局 dh++; //出局人数累加 // printf(" %d\n", i); //输出每个出局顺序 mouth=1; //报数重新置为1 i++; //加1,遍历,循环 } else{ mouth++; i++; } } if(i==n)i=0; } int z=0; //输出最后 幸存 位置 for(int i=0;i<n;i++){ if(a[i]!=1){ z=i; // printf("%d\n", i); } } printf("%d",z+1); return 0; }
本文是对CSDN博主文章理解所写
文章链接:
版权声明:本文为CSDN博主「StazSans」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_61960789/article/details/121764029
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:767 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:466 |
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:642 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:716 |
A+B for Input-Output Practice (C语言代码)浏览:505 |
星期判断机 (C语言代码)浏览:892 |
蓝桥杯历届试题-翻硬币 (C++代码)浏览:954 |
输入输出格式练习 (C语言代码)浏览:883 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:494 |
生日日数 (C语言代码)浏览:1575 |