程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 中國剩余定理(也叫孫子定理)

中國剩余定理(也叫孫子定理)

編輯:C++入門知識

今兒偶爾無聊,看到一個叫做“中國剩余定理”的玩意,覺得煞是好玩,便寫一點總結   上題目先,   假設一個數(1)被3除余2,(2)被5除余4,(3)被7除余6,求滿足條件的最小整數   lcm(5, 7) 為35 35*2=70剛好除以3余數為1   lcm(3, 7) 為21 21*1=21剛好除以5余1   lcm(5, 3) 為15 15*1 = 15剛好除以7余1   接下來(70*2 +21*4 +15*6)%lcm(70, 21, 15) = 104   最終,104就是要求的結果。   下面,寫成數學公式       題目:假設一個數M分別被A, B, C相除余數為a,b, c,求滿足條件的最小整數(A, B, C, a, b, c均為正整數)   步驟1: 先求解LCM(B, C) = A' 給A'乘上適當的正整數Ka(從1開始遞增), A'*Ka%A = 1一旦成立就終止,令A'' = A'*Ka同理可求B'', C''定義同上   步驟2:求解LCM(A, B, C)    結果:  那麼最後結果可以表示為(A'' * a + B'' * b + C" * c)%LCM(A, B, C);       下面,用C++實現完整代碼   [cpp]   #include <iostream>   using namespace std;      int GCD(int a, int b) {     int tmp;     if (a < b)       return GCD(b, a);     while (b) {       tmp = b;       b = a % b;       a = tmp;     }     return a;   }      int LCM(int a, int b) {     return a*b/GCD(a, b);   }      void GET2(int& K2, int K) {     int i = 1;     while (1) {       if (K2 % K == 1)         break;       else         K2 *= ++i;     }   }   int main() {     int A, A1, A2, B, B1, B2, C, C1, C2, a, b, c, i, D;     cout << "分別輸入三個除數和余數: ";     cin >> A >> a;     cin >> B >> b;     cin >> C >> c;        //求解最小公倍數A', B', C'     A2 = A1 = LCM(B, C);     B2 = B1 = LCM(A, C);     C2 = C1 = LCM(A, B);     D = LCM(A1, A); //三個數的最小公倍數        //求解A'', B'', C''     GET2(A2, A);     GET2(B2, B);     GET2(C2, C);        cout << "要求的數為: " << (A2 * a + B2 * b + C2 * c) % D << endl;     return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved