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

 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-07-31 22:15:52

"孙子算经"之"物不知数"题:中国剩余定理的相关文章

? 题目 一道超难的奥数题,猜生日. A告诉B他生日的月份,告诉C他生日的日期 B说:“如果我不知道A的生日,那C肯定也不知道.&quot; C说:”本来我不知道,现在我知道了.“ B说:”哦,那我也知道了.

现在的学生真是太生猛了,一道奥数题突破天际了.... 闲话少说,看题: 一道超难的奥数题,猜生日.A告诉B他生日的月份,告诉C他生日的日期B说:"如果我不知道A的生日,那C肯定也不知道."C说:"本来我不知道,现在我知道了."B说:"哦,那我也知道了."A的生日可能是:11月4日 11月5日 11月8日 1月4日 1月22日 3月1日 3月5日 7月1日7月2日 7月8日请问A的生日是几月几日? 附上某网友解答过程: 11月4日 11月5日 11

【xsy1116】数学题 奥数题

真实奥数题 题目大意:给你正整数k$,r$.问你存在多少对$(x,y)$,满足$x<y$且$x^2+y^2=kz^2$,并将所有符合条件的数对输出. 数据范围:$r≤1e9$,$k={1,2,3}$. 我们先考虑$k=1$的情况,显然就是一个求勾股数对数的问.有一种经典的枚举所有$x^2+y^2=z^2$且$(x,y,z)=1$的勾股数对数的式子: $\begin{cases} x=2nm\\ y=n^2-m^2 \\ z=n^2+m^2 \end{cases}$ 证明的话,展开下式子算算就好

从150盏灯这道奥数题说起......

前段时间,成都9岁学生纠错奥赛名题这篇文章在网上爆红.本文不关注神童之类的新闻,仅仅从计算机实现的角度来验证题目正确性. 题目描述(需求描述): 150盏亮着的电灯,各有一个拉线开关控制,按顺序编号为1,2,3,-,150.将编号为3的倍数的灯的拉线各拉一下,再将编号为5的倍数的灯的拉线各拉一下,拉完后亮着的灯数为__盏. 使用暴力穷举法来获得正确答案: 为了简单期间,我们可以将150盏灯缩小10倍,变为15盏灯,这样就很容易用暴力穷举法来标记出灯的最终结果: 答案: 第一遍拉灭3的倍数,15÷

新加坡小学奥数题:谢丽尔的生日

 阿尔贝茨和贝尔纳德想知道谢丽尔的生日,于是谢丽尔给了他们俩十个可能的日期:5月15日.5月16日.5月19日.6月17日.6月18日.7月14日.7月16日.8月14日.8月15日.8月17日.谢丽尔只告诉了阿尔贝茨她生日的月份,告诉贝尔纳德她生日的日子.阿尔贝茨说:我不知道谢丽尔的生日,但我知道贝尔纳德也不会知道.贝尔纳德回答:一开始我不知道谢丽尔的生日,但是现在我知道了.阿尔贝茨也回答:那我也知道了.那么,谢丽尔的生日是哪月哪日? 很简单的一道题,不知道为什么会火起来.求解也很简单,首

【Vijos P1052】 贾老二算算术 高斯消元傻题

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43445323"); } 题解: 虽然是说有唯一解,但是依然需要在消到某一层时判0/非0,然后适当交换位置. 代码: #include <cstdio> #include <cstring> #include <iostr

qdu-凑数题(01背包)

Description 小Q手里有n(n<=1000) 个硬币,每枚硬币有一定的金额(200=>x>=1)他想知道,用这些硬币(每枚硬币只能用一次,但可能会有等面值的用两次) 能组成多少种不同的金额? Input 第一行 n,表示第二行一共有n个数字,第二行 表示n个数字 Output 第一行 输出 m, 表示可以组成多少种不同的金额第二行 按照从小到大的顺序输出所有的金额. 注意,每行的结尾,不要有空格,否则你的答案可能会被判错. Sample Input 1 2 1 2 Sample

CPC23-4-K. 喵喵的神数 (数论 Lucas定理)

喵喵的神?数 Time Limit: 1 Sec Memory Limit: 128 MB Description 喵喵对组合数比較感兴趣,而且对计算组合数很在行. 同一时候为了追求有后宫的素养的生活,喵喵每天都要研究 质数. 我们先来复习一下什么叫做组合数.对于正整数P.T 然后我们再来复习一下什么叫质数.质数就是素数,假设说正整数N的约数仅仅有1和它本身,N就是质数:另外. 1不是质数. 今天,喵喵想要知道 Input 输入第一行是一个整数N(N<=1000). 接下来N行,每行包含一个正整

小光棍数(同余定理)

小光棍数 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数.他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少? 输入 有多组测试数据.第一行一个整数n,表示有n组测试数据.接下来的每行有一个整数m. 输出 输出第m个小光棍数. 样例输入 1 1 样例输出 471 /*同余定理 即

JZYZOJ1376 [coci2011]友好数对 容斥定理 状态压缩

http://172.20.6.3/Problem_Show.asp?id=1376 题意:找给出的数中含有相同数字的数对的对数. mmp数论题竟然卡快读,莫名拉低通过率什么的太过分了. 刚开始想到了怎么容斥但是没法实现,看了标程发现需要状压,我还是太菜了. 代码 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cm