这是一种非常简单的思想,没有用到中国剩余定理中的公式;
函数中k为最终结果,s为前i个数的最小公倍数
具体步骤见代码注释
Code
#include<iostream>
#include<algorithm>
using namespace std;
int a[15],p[15],n;
int crt(int a[],int p[],int n){
int k=p[1],s=a[1];//k初值为第一个数的余数这是满足第一个数余数条件的最小值,s当前为前1个数的最小值
for(int i=2;i<=n;i++){
while(k%a[i]!=p[i]) k+=s;//只要k不符合下一个条件,疯狂累加最小公倍数
s*=a[i];//s累乘,最小公倍数范围增加1
}
return k;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&p[i]);
}
printf("%d",crt(a,p,n));
return 0;
}