1 #include<stdio.h> 2 3 // 4 // 作者:吴仟灵 5 // 时间:2016、04、21 6 // 7 // "孙子算经"之"物不知数"题: 8 // 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 9 // 10 // 根据题意我们有如下同于方程组: 11 // x=2%3 ---> x=3*k+2 12 // x=3%5 13 // x=2%7 14 // 15 16 17 // 分析法求解 18 int analytical(float m1, float m2, float m3, float a1, float a2, float a3) 19 { 20 float x=0,k1=0.0,k2=0.0,k3=0.0; 21 22 for(k1=0; ;k1++){ 23 x=m1*k1+a1; // => x=3*k+2 24 k2=(x-a2)/m2; // => k=(x-2)/3 25 if(k2==(int)k2) // 判断k2是否为整数 26 { 27 k3=(x-a3)/m3; 28 if(k3==(int)k3) // 判断k2是否为整数 29 break; 30 } 31 } 32 return (int)x; 33 } 34 35 36 // 中国剩余定理求解 37 int chineseRemainderTheorem(int m1, int m2, int m3, int a1, int a2, int a3) 38 { 39 int i,x=0; 40 int M,M1,M2,M3; 41 int y1,y2,y3; 42 43 M =m1*m2*m3; 44 M1=m2*m3; 45 M2=m1*m3; 46 M3=m1*m2; 47 y1=M1%m1; 48 y2=M2%m2; 49 y3=M3%m3; 50 x=(a1*M1*y1+a2*M2*y2+a3*M3*y3)%M; 51 52 return x; 53 } 54 55 56 int main() 57 { 58 // x=2%3 x=a1%m1 59 // x=3%5 x=a2%m2 60 // x=2%7 x=a3%m3 61 int m1=3,m2=5,m3=7; 62 int a1=2,a2=3,a3=2; 63 printf("分析法:\nx=%d \n\n",analytical(m1,m2,m3,a1,a2,a3)); 64 printf("中国剩余定理:\nx=%d \n\n",chineseRemainderTheorem(m1,m2,m3,a1,a2,a3)); 65 return 0; 66 }
时间: 2024-10-04 19:11:05