#include <stdio.h>#include <string.h>#define N 100 /游戏上限人数/ int main(){ int n,m,left; int i,j; int k=0; /k表示第几个出局的人/ int a[N]={0}; printf("请输入参与总人数:"); scanf("%d",&n); printf("\n请输入报数的上限值:"); scanf("%d",&m); printf("\n请设定剩余人数:"); scanf("%d",&left); for(i=0;i<n;i++) /*参与者编号,完成后i==n*/ a[i]=i+1; printf("出局者名单如下:\n"); while(n>left) /确保足够的剩余人数/ { i=(i+m-1)%n; /由于i==n,取余后余数为0,故效果和i等于0相同。 a[i]=i+1,对于数组,下标和对应元素的数值总是相差1,如果说0+9-1为下标输出数值为9,要想接下来输出的数值为18, 下标加的数值为9,而不是9-1;对于约瑟夫游戏,每次输出后都在总数中除去一个数,并且使元素数值依次前移,那么 每次下标所加数值都要比报数上限值少1,这要才能使每次输出的数值相差报数上限值/ k++; printf("第 %-2d 位出局者为 %d\n",k,a[i]); /此处观察k的作用,第二个while中省略/ for(j=i+1;j<n;j++) a[j-1]=a[j]; /依次把空位补上。此处,虽然初始条件j=i+1,但是不可写为a[i]=a[j],因为此时i的值不变,而空位却依次后移,j一直变化/ n--; if(i==n) i=0; /由于每次i的赋值式有取余符,故此处只要是对应n的倍数即可,由于n不断变化,所以取公共倍数0,即0倍。即使没有if语句 也不影响结果,但有的话代入确定的数时,更便于计算/ } printf("\n生还者名单如下:\n"); while(n<=left) /此while语句还可写为for(i=0;i<left;i++) printf("%d\t",a[i]);表示输出剩余的成员,且为升序输出/ { i=(i+m-1)%n; k++; printf("%d\t",a[i]); for(j=i+1;j<n;j++) a[j-1]=a[j]; n--; if(i==n) i==0; } return 0;}
为什么输出生还者名单的那个while语句中,n<=left为循环条件,而语句中有n--,那么不就一直满足吗,为什么结果还是正常的。求大佬解答
用数组实现约瑟夫游戏
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- m0_66148981 2022-01-16 09:29关注
n自减,当n为0时,出现整数%0的错误语句,遇到这种语句,终止编译,但前面不受影响,已试验
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 ansys fluent计算闪退
- ¥15 有关wireshark抓包的问题
- ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
- ¥15 向数据表用newid方式插入GUID问题
- ¥15 multisim电路设计
- ¥20 用keil,写代码解决两个问题,用库函数
- ¥50 ID中开关量采样信号通道、以及程序流程的设计
- ¥15 U-Mamba/nnunetv2固定随机数种子
- ¥15 vba使用jmail发送邮件正文里面怎么加图片
- ¥15 vb6.0如何向数据库中添加自动生成的字段数据。