韩信点兵问题
来源:互联网 发布:java适配器模型 编辑:程序博客网 时间:2024/06/05 05:51
韩信点兵问题是一个古老的历史传说:相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入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
思路:通过遍历10到100的整数,找到能同时除以3余a,除以5余b,除以7余c的数即可。
同时在遍历时,有两种方法,一种是(i-a)%3==0&&(i-b)%5==0&&(i-c)%7==0,一种是i % 3 == a && i % 5 == b && i % 7 == c。显然前者要多做减法运算,因此时间也就更多一些。
除此之外,借助古人的智慧,有一种更为直接的算法,(a * 70 + b * 21 + c * 15) % 105
70 是5和7的公倍数中恰好除以3余1的,21是3和7的公倍数中除以5恰好余1的,15是3和5的公倍数中除以7恰好余1的。
package acmtest;import java.util.Scanner;public class Mainb {public static void main(String[] args) {Scanner in = new Scanner(System.in);int a = in.nextInt();int b = in.nextInt();int c = in.nextInt();int i;for (i = 10; i <= 100; i++) {// 方式一,逆向取余算法// if((i-a)%3==0)这种形式运行时间要多很多// 方式二,正向计算if (i % 3 == a && i % 5 == b && i % 7 == c) {System.out.println(i);// 方式三,中国剩余问题算法 , 70,21,15是手算出来的,分别是5与7的公倍数中恰好除3余2的巴拉巴拉// System.out.println((a * 70 + b * 21 + c * 15) % 105);}}}}
0 0
- 韩信点兵问题
- 韩信点兵问题
- 韩信点兵问题
- 韩信点兵问题
- 韩信点兵问题
- 韩信点兵问题
- 韩信点兵问题
- 韩信点兵问题------凌风
- 谈韩信点兵问题
- 韩信点兵问题算法
- C语言 韩信点兵问题
- 韩信点兵的问题求解方法
- 韩信点兵问题的神解法
- 程序设计入门3 韩信点兵问题
- //韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 将一个数组逆序输出。
- 远程连接mysql
- 如何解决springmvc中文乱码问题
- 201503-3-节日
- IMU模块ADIS16448调试过程及经验总结
- 韩信点兵问题
- php文件上传
- Struts2学习——1100GlobalResult
- UVa 1583
- 201412-3-集合竞价
- hdu 2546饭卡 01背包问题
- PHP and MySQL Web开发初接触(1)
- 网站分析(二)
- Java反射的应用 --- 内省