PHP 约瑟夫环 报数问题,约瑟夫环问题(报数题解)

题型描述

n 个人围成一圈,从第一个人开始报数,报到 m 的人出圈,下一个人重新开始报数,最后只剩下一个人。

该问题需要模拟整个过程或者直接得到最后一个人的编号。

解题思路

1.数组实现(模拟整个过程):

将 n 个人的编号存入数组,从第一个人开始报数,输出报数 m 的人的编号,并将该编号清零(表示出圈)。在之后的每次报数之前要判断是否在圈内,重复这样的操作直至出圈的人数等于 n 。

2.循环链表(模拟整个过程)

3.数学推导公式(直接得到最后一个人的编号)->待学习

实例题解

报数

题目描述

输入两个正整数 n 和 m( (1

请按退出顺序输出退出圈子的人的编号,以及最后一个人的编号。

输入示例

5

3

输出示例

No1: 3

No2: 1

No3: 5

No4: 2

Last No is: 4

完整代码

#include

int main()

{

int n, m, i, count = 0, num = 0;

int a[100];

scanf("%d%d", &n, &m);

for (i = 1; i <= n; i++) {

a[i] = i;

}/*存入编号*/

for (i = 1; ; i++) {

if (a[i] != 0) {

num++; /* num 表示计数器*/

if (num == m) {

count++;

if (count == n) {

break;

}

printf("No%d: %d\n", count, a[i]);

a[i] = 0;

num = 0;

}/* 报数为 m 出圈:

出圈人数加一,输出编号,编号清零,计数器清零*/

}

if (i == n) {

i = 0;

}

}

printf("Last No is: %d", a[i]);

return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值