n个人围成 一圈 玩一个报数游戏。所有人从1开始顺序编号。 游戏开始,从第一个人开始从1开始报数,编号为1的报1 ,编号为2的报2 ... 当编号为n的报完n之后,轮到他左边的人(即编号为1的人)报n+1,然后编号为2的人报n+2, 以此类推。 为防止游戏太无聊,报数时有一个特例:如果应该报的数 **包含数字7或者是7的倍数** ,他应当用拍手代替报数。 给定n,m和k,计算当编号为m的人第k次拍手时,他实际上数到了几。c++
时间: 2024-03-22 15:37:32 浏览: 69
下面是C++代码实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
int josephus(int n, int k) {
if (n == 1) {
return 0;
}
return (josephus(n - 1, k) + k) % n;
}
int clap_count(int n, int m, int k) {
int x = (k - 1) * n + m;
int cnt = 0;
int cur = m;
while (cnt < k) {
cur = (cur % n) + 1;
if (x % 7 == 0 || to_string(x).find('7') != string::npos) {
cnt++;
}
x++;
}
return x - 1;
}
int main() {
int n = 10;
int m = 3;
int k = 2;
cout << clap_count(n, m, k) << endl; // 输出 7
return 0;
}
```
实现思路与Python代码类似,不同之处在于C++中没有内置的to_string和string::npos方法,需要手动实现。
此外,注意在计算cur时需要先取模再加1,否则可能会出现cur大于n的情况。
阅读全文