文章
81
粉丝
2
获赞
531
访问
13.7k
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int ans = 0;
for(int i = 2; i <= n; i++){
ans = (ans + 3) % i;
}
cout << ans + 1;
return 0;
}
约瑟夫环公式:f(n) = (f(n-1) + k) % n
程序首先读取输入的人数 n。为了表示最后留下的小朋友位置,定义变量 ans,表示当前人数情况下最后留下者的下标(从 0 开始)。当只有 1 个人时,显然留下的下标为 0,因此将 ans 初始化为 0。
随后通过循环从 2 一直计算到 n。每增加一个人时,根据上一轮结果更新当前留下者的位置。更新公式为 ans = (ans + 3) % i,其中 i 表示当前人数,3 表示每次数到第 3 个出局。由于每次删除一个人后,剩余人的编号会整体发生移动,因此需要在上一轮结果的基础上向前移动 3 个位置,并通过取模运算保证下标仍然在当前人数范围内。
循环结束后,ans 表示最终留下者的下标,但该下标是从 0 开始计数,而题目中的编号是从 1 开始,因此输出时需要加 1,即输出 ans + 1。通过这种递推方式,可以避免逐个模拟出局过程,使程序更加简洁高效。
登录后发布评论
暂无评论,来抢沙发