中国剩余定理(CRT)—韩信点兵
求解下面的同余方程组:
x=a1(mod m1)
x=a2(mod m2)
......
求满足上诉同余式的x;
例题:韩信点兵,韩信带1500人打仗,战死400~500人,站成3人一排多出2人,站成5人一排多出4人,站成6人多出7人,韩信马上求出人数为1049人
由题意得:x=2(mod3),x=4(mod 5),x=6(mod 7),求x。
#includeusing namespace std; int find_ni(int a, int b) {//求出a mod b 的逆; int i; for (i = 1; (i * a - 1) % b != 0; i++); return i; } int main() { int remainder[10], divisor[10], M[10], niM[10], m = 1, result = 0,i,X=0; cout << "请输入同余式方程a的值,输入0表示输入结束" << endl;//x=a mod m; for (int i = 0; i < 10; i++) { cin >> remainder[i]; if (remainder[i] == 0) break; } cout << "请输入同余式方程m的值,输入0表示输入结束" << endl;//x=a mod m; for ( i = 0; i < 10; i++) { cin >> divisor[i]; if (divisor[i] == 0) break; m *= divisor[i]; } int count = i;//count代表有多少个同余式,不等于计入divisor[]数组大小 cout << "求对应M[i]的逆元" << endl; for ( i = 0; i < count; i++)//求M[i]的逆元; { M[i] = m / divisor[i]; niM[i] = find_ni(M[i], divisor[i]); } for (int i = 0; i < count; i++) { cout << niM[i] << " "; } for (int i = 0; i < count; i++) { X = X + M[i] * niM[i] * remainder[i]; } X = X % m; for (i = 0; result < 1100; i++) { result = i * m + X; if ((i * m + X) > 1000) break; } cout << "result=" << result << endl; system("pause"); return 0; }