中國剩餘定理(模板+程式碼)
阿新 • • 發佈:2019-01-05
#include<stdio.h> #include <iostream> using namespace std; //擴充套件歐幾里得演算法 int exgcd(int a,int b,int &x,int &y) { int d; if(b==0) { x=1;y=0; return a; } d=exgcd(b,a%b,y,x); y-=a/b*x; return d; } //中國剩餘定理 ,r[]存放餘數 ,prime[]存放兩兩互質的數 int Chinese_Remainder(int r[],int prime[],int len) { int i,d,x,y,m,n=1,sum=0; //計算所以除數的積n,也是所以除數的最小公倍數 for(i=0;i<len;i++) n*=prime[i]; //計算符合所以條件的數 for(i=0;i<len;i++) { m=n/prime[i];//計算除去本身的所有除數的積m d=exgcd(prime[i],m,x,y);//計算w[i]*x+m*y=gcd(w[i],m)的一個解y //累加整數解y的同並不斷對n取餘,其利用公式:(a+b)%c=(a%c+b%c)%c sum=(sum+y*m*r[i])%n; } return (n+sum%n)%n;//滿足所以方程的最小解 } int main() { int n,i; int prime[15],r[15]; while (printf("請輸入組數n:\n"),scanf("%d",&n)!=EOF) { printf("請依次輸入每組的除數和餘數:\n"); for (i=0;i<n;i++) { scanf("%d%d",&prime[i],&r[i]); } //printf("%d\n",Chinese_Remainder(b,w,n)); printf("符合條件的最小整數:%d\n\n",Chinese_Remainder(r,prime,n)); } return 0; }
核心程式碼:
int Chinese_Remainder(int r[],int prime[],int len)
{
int i,d,x,y,m,n=1,sum=0;
for(i=0;i<len;i++)
n*=prime[i];
for(i=0;i<len;i++)
{
m=n/prime[i];
d=exgcd(prime[i],m,x,y);
sum=(sum+y*m*r[i])%n;
}
return (n+sum%n)%n;
}