C++代码:统计每次投掷后拿到球的孩子数量


假设我们有一个数字n。一些孩子站在一个圆圈上。他们的编号从1到n,按顺时针顺序排列,1号孩子拿着球。首先,1号孩子把球传给下一个顺时针方向的孩子,然后2号孩子把球传给下下一个孩子(4号孩子),然后4号孩子把球传给7号孩子,依此类推。当球被抛出时,它可能会超过圆圈的起点。并非所有孩子在游戏中都能拿到球。如果一个孩子没有拿到球,我们需要找到每次投掷后拿到球的孩子们的编号。

因此,如果输入是n = 10,则输出将是[2, 4, 7, 1, 6, 2, 9, 7, 6]。

步骤

为了解决这个问题,我们将遵循以下步骤:

p := 1
for initialize i := 1, when i < n, update (increase i by 1), do:
   p := p + i
   p := p mod n
   if not p is non-zero, then:
      p := n
   print p

示例

让我们看看下面的实现以更好地理解:

#include <bits/stdc++.h>
using namespace std;
void solve(int n){
   int p = 1;
   for (int i = 1; i < n; i++){
      p += i;
      p %= n;
      if (!p)
         p = n;
      printf("%d, ", p);
   }
}
int main(){
   int n = 10;
   solve(n);
}

输入

10

输出

2, 4, 7, 1, 6, 2, 9, 7, 6,

更新于:2022年3月30日

1K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告