韩信点兵(hanxin)

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件结束为止。

样例输入:

2 1 6

2 1 3

样例输出:

Case 1: 41

Case 2: No answer

方法一:已知总人数不小于10,不超过100,则在此范围内使用for循环依次检验总人数所排队型是否满足队尾人数。

#include <iostream>
#include <stdio.h>
using namespace std;int main()
{int sum=0,a,b,c;int kcase=1;while(scanf("%d%d%d",&a,&b,&c)==3){for(sum=10;sum<=100;sum++){if(sum%3==a&&sum%5==b&&sum%7==c){printf("Case %d: %d\n",kcase++,sum);break;}}if(sum==101){kcase++;printf("No answer\n");}}return 0;
}

方法二:中国剩余定理,又称为中国余数定理、孙子剩余定理,古有"韩信点兵"、"孙子定理"、"鬼谷算"、"隔墙算"、"剪管术"、"秦王暗点兵"、"物不知数"之名,是数论中的一个重要命题。

在中国古代著名数学著作《孙子算经》中,有一道题目叫做“物不知数”,原文如下:

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。

中国数学家秦九韶于1247年做出了完整的解答,口诀如下:

三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五使得知

这个解法实际上是,首先利用秦九韶发明的大衍求一术求出

5和7的最小公倍数35的倍数中除以3余1的最小一个为70(这个称为35相对于3的数论倒数),

3和7的最小公倍数21(除以5余1)相对于5的数论倒数21,

3和5的最小公倍数15(除以7余1)相对于7的数论倒数15。

然后70×2+21×3+15×2=233,233便是可能的解之一。

它加减3、5、7的最小公倍数105的若干倍仍然是解,因此最小的解为233除以105的余数23。

附注:这个解法并非最简,因为实际上35就符合除3余2的特性,所以最小解是:35×1+21×3+15×2-3×5×7=128-105=23

最小解加上105(=3×5×7)的正整数倍都是解

物不知数”的解法实际上给出了求解一般同余方程组的方法。

设m1,m2,…,mi为两两互质的正整数,a1,a2,…,ak为任意整数,则同余方程组:

x≡a1(mod m1);

x≡a2(mod m2);

……

x≡ai(mod mi);

总有整数解,并且它的全部解可模仿上述方法得到。

#include <iostream>
#include <stdio.h>
using namespace std;int main()
{int a,b,c;int kcase=1;while(scanf("%d %d %d",&a,&b,&c)!=EOF){int s = a*70+b*21+c*15;s%=(3*5*7);if(s>100||s<10){kcase++;printf("No answer\n");}else{printf("Case %d: %d\n",kcase++,s);}}return 0;
}

C++循环结构设计——韩信点兵相关推荐

  1. 经典算法——韩信点兵问题的简单算法

    搞开发的人都需要积累一些经典算法,以备不时之须. 搞开发也有好几年了,积累的一些算法一直没做过整理,这段时间无聊就把这些算法整理以下,以备以后之用. 本文是关于阶梯的一个算法,用到了剩余定理算法,分享 ...

  2. 韩信点兵C语言实现的几种方法

    韩信点兵C语言实现的几种方法 问题描述: 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整 ...

  3. 练习作业5: 韩信点兵 , 统计方案 , 出现最频的数

    练习作业5: 韩信点兵 , 统计方案 , 出现最频的数 前排提示:百度搜题搜的爽,一直搜题一直爽 当然搜题就是交 就等着被放生吧88(狗头 本次题目理论上都应该可以独立完成✅ 问题 A: 韩信点兵 序 ...

  4. 韩信点兵--求分数序列前N项和--特殊a串数列求和--猜数字游戏

    实验4-1-5 韩信点兵 (10分) 在中国数学史上,广泛流传着一个"韩信点兵"的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳.据说韩信的数学水平 ...

  5. 关于初学算法,习题2-2 韩信点兵(hanxin)的一些需要谨记的点

    先给出题目:         相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人 一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入包含多组 数据,每组 ...

  6. 韩信点兵(hanxin)--算法竞赛经典习题2-2:相传韩信才智过人,从不清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,他每次只要掠一眼队伍的排尾就知道总数(C++实现)

    韩信点兵(hanxin)–算法竞赛经典习题2-2:相传韩信才智过人,从不清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,他每次只要掠一眼队伍的排尾就知道总数. (C++实现 ...

  7. python:韩信点兵

    1. [题目] 韩信点兵的算法如下:他让部下按1-3,1-5,1-7报数,并用每次报数的余数计算士兵总数,一次集合中,1-3报数余2,1-5报数余3,1-7报数余2,已知他们队伍人数在900-1000 ...

  8. 韩信点兵(python)

    ''' 韩信点兵 全部士兵按每行8人站立,剩余7人 全部士兵按每行7人站立,剩余6人 问题:已知每一营士兵人数在1000~2000之间,如何利用循环+判断表示出代码逻辑 '''for num in r ...

  9. C语言题目:韩信点兵

    题目:韩信点兵,韩信带1500名士兵打仗,战死四五百人,站3人一排,多出2人:站5人一排,多出4人:站7人一排,多出6人.编程计算还有多少士兵? 死四五百人,死最多是500,所以保底还剩1000,i赋 ...

  10. 韩信点兵问题的c++解法【笔记】

    韩信点兵.韩信有一队兵,他想知道有多少人,便让士兵排队报数. 按从1至5报数,最末一个士兵报的数为1: 按从1至6报数,最末一个士兵报的数为5: 按从1至7报数,最末一个士兵报的数为4: 最后再按从1 ...

最新文章

  1. 2021牛客暑期多校训练营(二) J. Product of GCDs 不动脑子的莫比乌斯反演做法(
  2. linux服务器后台运行程序
  3. 函数(复习),闭包,DOM
  4. [转载]永远保持随时可以离开的能力(不仅仅是张泉灵)
  5. 推荐优秀的SQL脚本调试工具Embarcadero DBArtisan 可以调试SQL Server 2000/2005 SQL调试工具汇总...
  6. Sql Server数据库备份和恢复:原理篇
  7. 音视频开发必备基本基础知识(1)
  8. 苹果MacBook Air 2022款也将有刘海屏设计
  9. 哪个厂商搭载鸿蒙系统,神助攻!魅族官宣接入鸿蒙,导致概念股由绿翻红,3支直接涨停...
  10. 有效利用番茄工作法提高效率--XorTime的使用方法
  11. IAR下STM32工程建立基本步骤
  12. 横向时间轴(进度条)
  13. 一文读懂MapReduce
  14. 2019PASS发布以来第一次更新,快点击查看!
  15. Makefile 的解读(一)
  16. 滚滚长江东逝水历史的天空
  17. 深入理解Object.entries()
  18. mysql数据库出现缓慢_MySQL查询缓慢的N种原因,以及N+1种解决方法
  19. [转]程序员成功之路 ——The road ahead for programmer(演讲稿)
  20. 一个印度人写的VC串口类CSerialCom(有串口基础介绍)

热门文章

  1. openresty php 环境,从零搭建php环境-openresty
  2. 弦外雨,晚风急 吹皱芳华太无情
  3. Forward(请求转发)和Redirect(重定向)的比较
  4. python中del的用法
  5. 低成本推广APP的策略
  6. vm15使用iso映像文件_什么是ISO文件(以及如何使用它们)?
  7. js 对象拼接的方法 数组 Map Set
  8. HBuilder打包App教程
  9. flask 蓝本(blueprint)
  10. win10 文件系统错误-2147416359