#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;

int EXTENDED_EUCLID(int a,int b,int &x,int &y)//擴(kuò)展歐幾里德算法


{
if(b==0)

{
x=1;
y=0;
return a;
}
int r=EXTENDED_EUCLID(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return r;
}

int MODULAR_LINEAR(int a,int b,int n)//求解模線性方程


{
int d,x,y;
int x0;
d=EXTENDED_EUCLID(a,n,x,y);
x0=(x*(b/d)+n)%n;
return x0;
}

int CHINESE_RESIDUE_THEOREM(int n[],int b[],int k)//求解模線性方程組,所有數(shù)據(jù)從1號下標(biāo)開始存儲


{

int result=0;
int i;
int N=1;
int *m=new int [k+1];
int *reversem=new int [k+1];
int sum=0;
for(i=1;i<=k;i++)

{
N*=n[i];
}
for(i=1;i<=k;i++)

{

m[i]=N/n[i];
reversem[i]=MODULAR_LINEAR(m[i],1,n[i]);
sum+=m[i]*reversem[i]*b[i];
}
result=sum%N;
return result;
}


int main ()


{

int num;
int i;
printf("參考格式:X mod n[i] = b[i]\n");
cout<<"請輸入方程的個數(shù):";
cin>>num;
int *n=new int [num+1];
int *b=new int [num+1];
for(i=1;i<=num;i++)

{

cout<<"請輸入第"<<i<<"個方程的n和b:";
cin>>n[i]>>b[i];
}
int result=CHINESE_RESIDUE_THEOREM(n,b,num);
cout<<"解為:";
cout<<result<<endl;
cout<<"謝謝你的使用"<<endl;
system("pause");
return 0;
}
至于擴(kuò)展歐幾里德的通解可以看轉(zhuǎn)到博客里的一篇文章