码迷,mamicode.com
首页 > 其他好文 > 详细

"孙子算经"之"物不知数"题:中国剩余定理

时间:2016-04-21 10:18:19      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

 

 

 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 }

 

"孙子算经"之"物不知数"题:中国剩余定理

标签:

原文地址:http://www.cnblogs.com/wuqianling/p/5415758.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!