难点
1、按照流程进行解算,可以得出正确答案,但是时间超时,第一段代码; 2、用约瑟夫环的解法解算,可以通过,第二段代码;
Description:
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
Input:
包含多组数据。
每行表示初始人数n。
最后一组是0,不用处理。
Output:
对每个测试数据输出最后一人的初始编号
Sample Input:
3
7
0
Sample Output:
2
4
#include <iostream>
#include "string"
using namespace std;
/**
* kkmd66
* @return
*/
int main() {
int n;
while (cin >> n && n != 0) {
//输入数据
string str;
for (int i = 1; i <= n; ++i) {
string c = to_string(i);
str += c;
}
//依次踢出
int pos = 0;
while (str.size() > 1) {
for (int i = 0; i < 2; ++i) {
if (pos > str.size() - 1)
pos = 0;
else
pos++;
if (pos > str.size() - 1)
pos = 0;
}
if (pos > str.size() - 1)
pos = 0;
str.erase(pos, 1);
if (pos > str.size() - 1)
pos = 0;
}
//输出
cout << str[0] << endl;
}
return 0;
}
#include <iostream>
using namespace std;
/**
* kkmd66
* 约瑟夫环
* @return
*/
int main() {
int n;
while (cin >> n && n != 0) {
int result = 0;
//约瑟夫环
for (int i = 2; i <= n; i++) {
result = (result + 3) % i;
}
cout << result + 1 << endl;
}
return 0;
}