酷代码 AI
菜单

题目描述 据说著名犹太历史学家Josephus有过以下的故事: 在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。 这个过程沿着圆圈一直进行,直到最终只剩下两个人留下,这两个人就可以继续活着。 然而Josephus 和他的朋友并不想遵从。 问题是,一开始要站在什么地方才能避免被处决。 Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 现在我们将这个问题简化: 有 个人围坐一圈并按顺时针方向从 到 编号。 现在从第 个人开始进行 到 的报数,报数到 的人,此人出圈;再从他的下一个人重新开始 到 的报数; 如此进行下去直到所剩下一人为止,最后剩下的人的编号是多少呢? 输入 一个整数 . ( ) 输出 输出最后剩下这个人的编号. 样例输入 复制 10 样例输出 复制 5 来源/分类

这是一个约瑟夫问题。 给定 n 个人,从第 1 个人开始报数,每次数到 m 的人出局,下一个人重新从 1 开始报数,直到只剩一人。 题目中 m 固定为 3。 数学递推公式(约瑟夫问题 m=3 的情况): 设 f(n) 表示 n 个人时最后剩下的人的编号(编号从 0 到 n-1)。 递推关系: f(1) = 0 f(n) = (f(n-1) + 3) % n 如果编号从 1 到 n,则结果为 f(n) + 1。 代码实现(C++): ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; int last = 0; // f(1) = 0 for (int i = 2; i <= n; i++) { last = (last + 3) % i; } cout << last + 1 << endl; return 0; } ``` [2025-12-16 18:06:37 | AI问答 | 244点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多