问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?答曰:二十三。

这个问题用现在的话说就是,有一个数,用3除余2,用5除余3,用7除余2,问该数是多少?

该问题最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题。是一个数学问题,更准确地说是一个数论问题,也是一个经典的数论问题。

孙子定理是中国古代求解一次同余式组的方法,是数论四大定理之一,国际上称为中国剩余定理。该题是孙子定理中的典型问题。

现在是计算机时代,绝大多数问题都用计算来解决,即编写程序计算解决。用数论算法来解,应该说是正解。参见:《模乘逆元与孙子定理》一文。

如果只学过计算机语言而不懂数论,是不是就没有办法来解这个问题了?答案显然是否定的。解决这个问题,穷举法的应该是一个办法,总是能够算出结果来的。

然而,计算过程不同,速度有快慢之别。这里给出的程序,从模(除数)最大开始穷举试探,步伐大必然步数少。根据本题题意,7为最大除数,所以优先使用除数为7的条件;除7余2,其解必然是2+7k(k=0,1,2,,3,......)的形式,k从0开始逐一增大穷举试算,把满足条件的解找出来。

用孙子定理或者说用数论的方法解决问题,对于模(除数)是有要求的。要求模(除数)必须是两辆互素的。而这个程序对此没有要求。

对于标准的孙子定理问题,算出的解是23。其实,该问题的通解是23+105k(k=0,1,2,,3,......),105=3*5*7。

还需要主意的一点是,编写程序需要有通用性,才能做到一劳永逸。

程序如下:

/* 孙子定理(中国剩余定理):穷举法 */#include <stdio.h>int crt(int m[], int r[], int n)
{int x, flag, i, temp;// step1 找出最大的模(除数),放在m[0],相应的余数也放在r[0]for(i=1; i<n; i++) {if(m[i] > m[0]) {temp = m[i];m[i] = m[0];m[0] = temp;temp = r[i];r[i] = r[0];r[0] = temp;}}// step2 试探法求满足各个模(除数)条件的数x = r[0];flag = 0;while(!flag) {flag = 1;for(i=1; i<n; i++)if(x % m[i] != r[i]) {flag = 0;break;}if(flag)break;x += m[0];}return x;
}int main(void)
{int m[] = {3, 5, 7};int r[] = {2, 3, 2};printf("%d\n", crt(m, r, sizeof(m)/sizeof(int)));int m2[] = {103, 107, 109};int r2[] = {44, 63, 21};printf("%d\n", crt(m2, r2, sizeof(m2)/sizeof(int)));int m3[] = {30, 51, 34, 103};int r3[] = {29, 2, 19, 30};printf("%d\n", crt(m3, r3, sizeof(m3)/sizeof(int)));return 0;
}

3组数据的计算结果如下:

23
2310
2399

I00022 孙子定理相关推荐

  1. poj 1006 java_POJ 1006 Biorhythms 数论-(孙子定理)

    这是一道变形的孙子定理的题目,直接用公式. 代码如下: #include #include #include #include #include #include #include #include ...

  2. 中国剩余定理(孙子定理)(精华详细版!)

    问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 简单点说就是,存在一个数x,除以3余2,除以5余三,除以7余二,然后求这个数.上面给出了解法.再明白这个解法的原理之前,需要 ...

  3. 信奥中的数学:孙子定理 中国剩余定理

    孙子定理 中国剩余定理 孙子定理 中国剩余定理_Dreamer Thinker Doer-CSDN博客 中国剩余问题(简介+详解) 中国剩余问题(简介+详解)_dreamzuora的博客-CSDN博客 ...

  4. 【bzoj1951】【古代猪文】Lucas定理+欧拉定理+孙子定理

    (上不了p站我要死了,当然是游戏原画啊) Description (题面倒是很有趣,就是太长了) 题意: 一个朝代流传的猪文文字恰好为N的k分之一,其中k是N的一个正约数(可以是1和N).不过具体是哪 ...

  5. 中国剩余定理(孙子定理)

    中国剩余定理,也称孙子定理,是中国古代求解一次同余式组的重要方法. <孙子算经>里面的"物不知数"说的是这样的一个题目:一堆东西不知道具体数目,3个一数剩2个,5个一数 ...

  6. 孙子定理(中国剩余定理)

    中国剩余定理 中国剩余定理这样描述,给出以下一元线性同余方程组 给出你n个ai和mi,求出符合题意的X值,一般输出最小解. ti 要用扩展欧几里得算法e_gcd()计算. 证明参照:点击打开链接 看个 ...

  7. 中国剩余定理 即 孙子定理

    中国剩余定理 即 孙子定理 . 中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理.又称中国剩余定理. 中国剩余定理------ 解法如下:假设存在一个数M M%A=a , M%B=b , ...

  8. 中国剩余定理(孙子定理)+ exgcd求逆元

    中国剩余定理   中国剩余定理又叫孙子定理.在<孙子算经>中有这样一个问题:"今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之 剩二(除以7余2) ...

  9. 算法——中国剩余定理(孙子定理)

    借15级上机的一道题数论の重逢来总结一下中国剩余定理 先举一个小例子 问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 说明白一点就是说,存在一个数x,除以3余2,除以5余三 ...

最新文章

  1. 盘点互联网大厂AI战略变迁,开发者将怎样pick前进路线?
  2. 学习Windows2008——设计活动目录
  3. C#在DataTable中使用LINQ
  4. java 远程udp_远程客户端不接收UDP数据包
  5. 专访腾讯产品总监邬沛君:TStack斩获OSCAR技术创新奖的背后
  6. linux 运维高级脚本生成器,Linux运维系列,Shell高级脚本自动化编程实战
  7. 微信小程序开发实战基础二、wxml模板,动态更新内联样式
  8. (5)css样式表特征
  9. cad加载dll_你的CAD为什么安装不上?进来看看你就知道了
  10. Qt Creator 预览QtCreator中的界面
  11. 《Linux内核设计与实现》读书笔记 - 目录 (完结)【转】
  12. apache2.4.18中启用h2c
  13. 微信小程序 - 实现简单登录和个人信息页面
  14. 安卓Camera屏幕竖屏适配
  15. opencv学习日记
  16. Thinkphp5 谷歌验证
  17. 图解 Redis,还有人看不懂?
  18. geany配置python_在python虚拟环境中使用geany
  19. mysql所选路径已经存在_mysql安装常见问题解决办法
  20. ARCGIS中如何把线图层和面图层叠加呢?

热门文章

  1. SpringCloud系列之Nacos+Dubbo+Seata应用篇
  2. 二进制方式搭建极简kubernetes1.10环境@centos7.3
  3. 深入浅出Docker(四):Docker的集成测试部署之道
  4. OGRE 1.7.2 [Cthugha] 编译方法
  5. html5移动web开发黑马掌上商城_月入35k大佬总结:web前端必须学习的内容(附全套前端教程)...
  6. Sqoop导入hive中null是空字符串还是‘null‘的问题(关注)
  7. java 捕获异常顺序_Java基础:异常捕获顺序
  8. 剑指offer面试题11. 旋转数组的最小数字(二分查找)
  9. 如何用Sql更新默认值
  10. TypeError: 'RGB' has type str, but expected one of: bytes(法1)