1. 程式人生 > >【劍指offer】圓圈中最後剩下的數字,C++實現

【劍指offer】圓圈中最後剩下的數字,C++實現

一行 AC 個人 ron namespace itl i++ float color

原創博文,轉載請註明出處!

# 題目

技術分享圖片

# 思路

本題即為典型的約瑟夫問題,通過遞推公式解決。

技術分享圖片

第一行表示每個人的下標,現在要從11個人中刪除報數為3的人,從圖中可以可看出最後7是勝利者。分析其中的規律:

第一輪中,11個人中勝利者7的角標是6;

第二輪中,10個人中勝利者7的角標是3;

第三輪中,9個人中勝利者7的角標是0;

第四輪中,8個人中勝利者7的角標是6;

第五輪中,7個人中勝利者7的角標是3;

第六輪中,6個人中勝利者7的角標是0;

第七輪中,5個人中勝利者7的角標是3;

第八輪中,4個人中勝利者7的角標是0;

第九輪中,3個人中勝利者7的角標是1;

第十輪中,2個人中勝利者7的角標是1;

第十一輪中,1個人中勝利者7的角標是0;

從第十一輪中倒推到第一輪:

從第十一輪中推出第十輪的角標數,(0+3)% 2 = 1

從第十輪中推出第九輪的角標數,(1+3)% 3 = 1

從第九輪中推出第八輪的角標數,(1+3)% 4 = 0

從第八輪中推出第七輪的角標數,(0+3)% 5 = 3

從第七輪中推出第六輪的角標數,(3+3)% 6 = 0

懶得寫了…….

從n個人中每隔m刪除一人,遞推公式為 f(n,m) = (f(n-1,m)) % n

# 代碼

#include <iostream>
using namespace std;

class Solution {
public:
    
// n表示多少個人,m表示隨機數 int LastRemaining_Solution(int n, int m) { // 特殊輸入 if(n == 0 || m < 0) return -1; // 遞推公式計算 int res = 0; for(int i = 1; i <= n; i++) { res = (res + m) % i; cout<<res<<endl; }
return res; } }; int main() { int n = 11; int m = 3; Solution solution; solution.LastRemaining_Solution(n,m); return 0; }

【劍指offer】圓圈中最後剩下的數字,C++實現