编程题《报数3的人退出圈子》
18.
【问题描述】
有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留下来的人的编号。
【输入形式】
考虑如下两种情况:
如果n超出“n must be a natural number less than 10000”,则打印“n is out of range of valid values.”;其中n应该用如上输入的具体的n数值代替;换行;
如果n是有效范围的数值,则打印“Last No. is:”;然后直接在冒号后面输出最后留下来的人的编号;换行;
【运行时的输入输出样例1】(下划线部分表示输入)
Input n(n must be a natural number less than 10000):5
Last No. is:4
【运行时的输入输出样例2】(下划线部分表示输入)
Input n(n must be a natural number less than 10000):100000
18.
【问题描述】
有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留下来的人的编号。
【输入形式】
考虑如下两种情况:
如果n超出“n must be a natural number less than 10000”,则打印“n is out of range of valid values.”;其中n应该用如上输入的具体的n数值代替;换行;
如果n是有效范围的数值,则打印“Last No. is:”;然后直接在冒号后面输出最后留下来的人的编号;换行;
【运行时的输入输出样例1】(下划线部分表示输入)
Input n(n must be a natural number less than 10000):5
Last No. is:4
【运行时的输入输出样例2】(下划线部分表示输入)
Input n(n must be a natural number less than 10000):100000
100000 is out of range of valid values.
解题思路与易错分析:
这道题其实就是约瑟夫环的简化,但是要注意输入值的合法性
具体的解体思路请移步与:
https://blog.csdn.net/qq_41682681/article/details/80678850
下面附上我的代码:
#include <iostream>
using namespace std;
int main()
{
cout << "Input n(n must be a natural number less than 10000):";
int n;
int k = 0;
cin >> n;
if(n>10000||n<=0)
{
cout << n << " is out of range of valid values.";
}
else
{
for(int i = 2; i <= n;i++)
{
k = (k + 3)%i;
}
cout << "Last No. is:"<<k+1;
}
}