m0_66148981 2022-01-15 20:52 采纳率: 75%
浏览 22
已结题

用数组实现约瑟夫游戏

#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--,那么不就一直满足吗,为什么结果还是正常的。求大佬解答

  • 写回答

1条回答 默认 最新

  • m0_66148981 2022-01-16 09:29
    关注

    n自减,当n为0时,出现整数%0的错误语句,遇到这种语句,终止编译,但前面不受影响,已试验

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月24日
  • 已采纳回答 1月16日
  • 创建了问题 1月15日

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示