韩信点兵问题

来源:互联网 发布: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