中国剩余定理(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。

#include<iostream>
using 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;
}

 

 

posted @ 2021-11-30 15:03  Grit_L。  阅读(418)  评论(0编辑  收藏  举报