韩信点兵算法

描述

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

输入

输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。例如,输入:2 4 5

输出

输出总人数的最小值(或报告无解,即输出Noanswer)。实例,输出:89

样例输入

2 1 6

样例输出

41

定理1 如a被n除所得的余数等b被n除所得的余数,c被n除所得的余数等于d被n除所得的余数, 则ac被n除所得的余数等于b d被n除所得的余数。

用同余式叙述就是:

如a≡b(mod n ),c≡d(mod n )

则ac≡b d(mod n )

定理2 被除数a加上或减去除数b的倍数,再除以b,余数r不变。即

如a ≡ r(mod b ),则a ± b n≡r(mod b )

例如70≡1(mod 3 )可得70±10×3≡1(mod 3 )

【韩信点兵法口诀的原理】

①能被5,7除尽数是35k,其中k=2,即70除3正好余1,70a 除3正好余a。

②能被3,7除尽数是21k,其中k=1,即21除5正好余1,21b 除5正好余b。

③能被3,5除尽数是15k,其中k=1,即15除7正好余1,15c 除7正好余c。

这样——

根据①可知 70a+21b+15c 除3正好余a。

根据②可知 70a+21b+15c 除5正好余b。

根据③可知 70a+21b+15c 除7正好余c。

(70a+21b+15c)%(3*5*7)为最小值,然后再判断最小值是否满足条件。

 1 #include <stdio.h>
 2
 3 int main(){
 4     int a;
 5     int b;
 6     int c;
 7     int result;
 8
 9     scanf("%d%d%d",&a,&b,&c);
10     result=(70*a+21*b+15*c)%(3*5*7);
11
12     if(result>=10 && result<=100)
13         printf("%d\n",result);
14
15     else
16         printf("No answer\n");
17
18     return 0;
19 }
时间: 2024-10-11 13:07:56

韩信点兵算法的相关文章

ACM试题 - 韩信点兵

1. ACM试题题源:http://acm.nyist.net/JudgeOnline/problem.php?pid=34 关于韩信点兵:淮安民间传说着一则故事——“韩信点兵”,其次有成语“韩信点兵,多多益善”.韩信带1500名兵士打仗,战死四五百人,站3人一排,多出2人:站5人一排,多出4人:站7人一排,多出6人.韩信马上说出人数:1049. 2. 解题思路 思路一:可以先求出三组数,这三组数分别是分别用3,5,7除总人数在规定范围内所有的可能数值,然后求得这三组数中相同的那个数即可. 例如

cogs——1786. 韩信点兵

1786. 韩信点兵 ★★★   输入文件:HanXin.in   输出文件:HanXin.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 韩信是中国军事思想“谋战”派代表人物,被后人奉为“兵仙”.“战神”.“王侯将相”韩信一人全任.“国士无双”.“功高无二,略不世出”是楚汉之时人们对其的评价.作为统帅,他率军出陈仓.定三秦.擒魏.破代.灭赵.降燕.伐齐,直至垓下全歼楚军,无一败绩,天下莫敢与之相争. 相传,韩信带兵打仗时,从不直接清点军队人数.有一次,韩信带1

数学上的一些小技巧韩信点兵的问题

对于韩信点兵的问题,一个数n:n%3=t1;n%5=t2;n%7=t3;如果现在告诉你这三个余数,问你怎么求出来n.只要求最小的一个n就行解法如下: 一.首先对于3来说,因为70能被5和7整除,并且对三取余等于1: 二.对于5来说,因为21能被3和7整除,并且对于5取余等于1 三.对于7来说,因为15能被3和5整除,并且对于7取余等于1. 四.则就是将70*t1+21*t2+15*t3;如果得到的数比105大,那么将这个数减去105:直到小于105: 原理就是: 70=3*n+1;所以70*t1

习题 2-1 位数 2-2 水仙花数 2-3 韩信点兵 2-4倒三角形 2-6 调和级数 2-7近似计算 2-8 子序列的和

2-1 位数 #include<stdio.h> #include<math.h> int main () { int n; for (n=100; n<=999; n++) { if(n == pow(n/100,3) + pow(n/10%10,3) + pow(n%10,3) ) printf("%d\n",n); } system("PAUSE"); return EXIT_SUCCESS; } 2-2 水仙花数 #includ

韩信点兵(中国剩余定理)

中国剩余定理是数论中的一个关于一元线性同余方程组的定理,说明了一元线性同余方程组有解的准则以及求解方法.又称为孙子定理,"韩信点兵""求一术""鬼谷算""隔墙算""剪管术""秦王暗点兵""物不知数"等名称. 例如:物不知数原文: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 宋朝数学家秦九韶对"物不知数"问题作出了完整系统的解

【C】韩信点兵

我姐给我出了一道题,让我去编一个韩信点兵的程序 学了循环结构后,总算编出来了 警告!有大量膜法 1 #include <stdio.h> 2 3 int main() 4 { 5 int A,a; 6 int B,b; 7 int C,c; 8 int D; 9 printf("有一数,除以\n"); 10 11 scanf("%d",&A); 12 printf("余\n"); 13 scanf("%d"

南阳理工--韩信点兵

#include<stdio.h>int main(){  int a,b,c;  int x;  scanf("%d%d%d",&a,&b,&c);  for(x=10;x<=100;x++)  {   if(x%3==a&&x%5==b&&x%7==c)   {    printf("%d\n",x);    break;   }  }  if(x>100)  {   printf(

4.韩信点兵:有一个数,用3除余2;用5除余3;用7除余2,求满足条件的最小数

(1)用IF嵌套: #include <iostream>using namespace std; int main(){    int i=100;    int minNum;    while(i>0)    {        if(i%3==2)        {            if(i%5==3)            {                if(i%7==2)                {                    minNum=i;   

韩信点兵-中国剩余定理(练习)

http://acm.nyist.net/JudgeOnline/problem.php?pid=34提交地址 韩信点兵-中国剩余定理. 题目可以用枚举很简单的做出来,在这里写是为了运用一下刚刚学习的中国剩余定理. 以前写过中国剩余定理的博客在这就不多说了. 如果下面的字母看不懂请看我的另一篇博客http://blog.csdn.net/u010123208/article/details/24314627 说一说思路吧. 1.首先我们要用数组存储我们的要的除数,和余数.我们用m[]来存储,余数