韩信点兵

来源:互联网 发布:淘宝网店运营策划书 编辑:程序博客网 时间:2024/06/09 18:10

描述

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入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
输出
输出总人数的最小值(或报告无解,即输出No answer)。实例,输出:89
样例输入
2 1 6
样例输出
41
#include <stdio.h>int main(){  int a,b,c;  int sum = 0;  scanf("%d %d %d",&a,&b,&c);  sum = a*70 + b*21 + c*15;  while (sum > 105)  {    sum = sum - 105;  }  printf("%d\n",sum);  return 0;}

我国古代学者早就研究过这个问题.例如我国明朝数学家程大位在他著的《算法统宗》(1593年)中就用四句很通俗的口诀暗示了此题的解法: 
三人同行七十稀, 
五树梅花甘一枝, 
七子团圆正半月, 
除百零五便得知. 
“正半月”暗指15.”除百零五”的原意是,当所得的数比105大时,就105、105地往下减,使之小于105;这相当于用105去除,求出余数. 
这四句口诀暗示的意思是:当除数分别是3、5、7时,用70乘以用3除的余数,用21乘以用5除的余数,用15乘以用7除的余数,然后把这三个乘积相加.加得的结果如果比105大,就除以105,所得的余数就是满足题目要求的最小正整数解. 
按这四句口诀暗示的方法计算韩信点的这队士兵的人数可得: 
70×2+21×3+15×4=263, 
263=2×105+53, 
所以,这队士兵至少有53人. 
在这种方法里,我们看到:70、21、15这三个数很重要,稍加研究,可以发现它们的特点是: 
70是5与7的倍数,而用3除余1; 
21是3与7的倍数,而用5除余1; 
15是3与5的倍数,而用7除余1. 
因而 
70×2是5与7的倍数,用3除余2; 
21×3是3与7的倍数,用5除余3; 
15×4是3与5的倍数,用7除余4. 
如果一个数除以a余数为b,那么给这个数加上a的一个倍数以后再除以a,余数仍然是b.所以,把70×2、21×3与15×4都加起来所得的结果能同时满足”用3除余2、用5除余3、用7除余4”的要求.一般地, 
70m+21n+15k (1≤m<3, 1≤n<5,1≤k<7) 
能同时满足”用3除余m 、用5除余n 、用7除余k”的要求.除以105取余数,是为了求合乎题意的最小正整数解. 

原创粉丝点击