/* 约瑟夫环
编号为1,2,3,……,n的n个人按顺时针方向围坐一圈。任选一个正整数作为报数上限m,
从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,从他在
顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计程序
输出出列顺序。
*/
#include<iostream>
using namespace std;
int main () {
int a[50]; //数组
int i; //巡历的位置的下标
int n; //人数
int count; //报数上限
int bound; //下标上限
int increment; //巡历下标的增加量
int j; //用于循环的变量
cout << "请输入人数:"; cin >> n;
cout << "请输入报数上限:"; cin >> count;
bound = n - 1;
increment = count - 1;
//给数组编号
for (i = 0; i <= bound; i++)
a[i] = i + 1;
while (bound >= 1) { //退出循环的条件是,bound小于1,即0时
i = i + increment; //第一个数字肯定不是,那么就从后面第二个开始。
i = i % bound - 1; //如果i大于bound,那么i将从i%bound-1的位置开始。如果i小于bound,那么结果还是i
//将a[i]后面的东西统统前移一位,将a[i]覆盖掉
for (j = i; j <= bound - 1; j++)
a[j] = a[j + 1];
bound--; //下标上限-1
}
cout << "最后一个人是 " << a[0] <<' '<< "号" << endl; //最后输出剩下的那个人原来的编号。
}
编号为1,2,3,……,n的n个人按顺时针方向围坐一圈。任选一个正整数作为报数上限m,
从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,从他在
顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计程序
输出出列顺序。
*/
#include<iostream>
using namespace std;
int main () {
int a[50]; //数组
int i; //巡历的位置的下标
int n; //人数
int count; //报数上限
int bound; //下标上限
int increment; //巡历下标的增加量
int j; //用于循环的变量
cout << "请输入人数:"; cin >> n;
cout << "请输入报数上限:"; cin >> count;
bound = n - 1;
increment = count - 1;
//给数组编号
for (i = 0; i <= bound; i++)
a[i] = i + 1;
while (bound >= 1) { //退出循环的条件是,bound小于1,即0时
i = i + increment; //第一个数字肯定不是,那么就从后面第二个开始。
i = i % bound - 1; //如果i大于bound,那么i将从i%bound-1的位置开始。如果i小于bound,那么结果还是i
//将a[i]后面的东西统统前移一位,将a[i]覆盖掉
for (j = i; j <= bound - 1; j++)
a[j] = a[j + 1];
bound--; //下标上限-1
}
cout << "最后一个人是 " << a[0] <<' '<< "号" << endl; //最后输出剩下的那个人原来的编号。
}