您的位置:首页 > 其它

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

2010-08-06 14:34 465 查看
搞开发的人都需要积累一些经典算法,以备不时之须。

搞开发也有好几年了,积累的一些算法一直没做过整理,这段时间无聊就把这些算法整理以下,以备以后之用。

本文是关于阶梯的一个算法,用到了剩余定理算法,分享下:

爱因斯坦曾出过这样一道有趣的数学题,有一个长阶梯,每步上2阶,最后剩1阶;若每步上3阶,最后剩2阶,若每步上5阶,后剩4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后一阶也不剩。问至少有多少阶阶梯?

这个是我国古代的韩信点兵问题:古人用剩余定理口算或心算,有计算机以后,可以由计算机帮忙解决了,算法很简单(JAVA实现):
package com.jack.arithmetic;

/**
* 韩信点兵算法
* @author jack
* @date 2010/08/06
*/
public class Ladder {

public static void main(String[] args) {
int count = 0;
while(count>=0){
if ((count % 2 == 1) && count % 3 == 2 && count % 5 == 4 && count % 6 == 5
&& count % 7 == 0) {
System.out.print("这个数字是:" + count);
break;
}else{
count++;
}
}
}
}
注:因为并没有告诉你会有多少阶梯,所以此处使用while循环进行处理,当出现满足所有条件的数时,显示此数,并结束循环;否则每次对count进行加加操作。
其实细想一下,能够被7整除,说明这个数一定是7的倍数,下面再改进一下算法:
int count = 0;
while(count>=0){
if ((count % 2 == 1) && count % 3 == 2 && count % 5 == 4 && count % 6 == 5
&& count % 7 == 0) {
System.out.print("这个数字是:" + count);
break;
}else{
count += 7;
}
}

注意:7是奇数却可以被整除,故结果一定是7的整数倍:

int c = 7;
while(c>=0){
if (c % 2 == 1 && c % 3 == 2 && c % 5 == 4 && c % 6 == 5) {
System.out.print("这个数字是:" + c);
break;
}else{
c = c + 14;
}
}

再考虑:台阶阶梯总数加一是为2、3、5、6的最小公倍数,而且是7的倍数,所以定是30的倍数减1,可得如下算法:
int x;
for (int i = 1; i < 10; i++)
{
if ((i * 30 - 1) % 7 == 0)
{
x = (i * 30 - 1);
System.out.println("这个数字是:" + x.ToString());
}
}

原文(作者博客)地址:www.52cfml.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: