韩信点兵问题的简单算法(downmoon)
2009-09-24 10:25
274 查看
有朋友问起这个问题:
爱因斯坦曾出过这样一道有趣的数学题,有一个长阶梯,每步上2阶,最后剩1阶;若每步上3阶,最后剩2阶,若每步上5阶,后剩4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后一阶也不剩。问至少有多少阶阶梯?编写一个JAVA程序,解决该问题。
这个是我国古代的韩信点兵问题:古人用剩余定理口算或心算,我们现在有计算机了,算法很简单:
我以C#为例,Java非常类似。JAVA
view plaincopy to clipboardprint?
public static void main(String[] args) {
int x;
for (x = 0; x < 200; x++)
{
if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5 && x % 7 == 0)
{
System.out.print("这个数字是:" +x);
}
}
}
说明:因为要取最小数,所以先设最大值100,无解,再设为200,得119
C#:
view plain
copy to clipboard
print
?
static
void Main( string [] args)
{
int x;
for (x = 0; x < 200; x++)
{
if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5 && x % 7 == 0)
{
Console.WriteLine("这个数字是:"
+ x.ToString());
}
}
Console.ReadKey();
}
后来有朋友提起是7的倍数,
于是再优化下:
view plain
copy to clipboard
print
?
static
void Main( string [] args)
{
int x;
for (x = 0; x < 200; x = x + 7)
{
if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5)
{
Console.WriteLine("这个数字是:"
+ x.ToString());
}
}
Console.ReadKey();
}
再考虑是奇数,更加简洁:
view plain
copy to clipboard
print
?
static
void Main( string [] args)
{
int x;
for (x = 7; x < 200; x = x + 14)
{
if ( x % 3 == 2 && x % 5 == 4 && x % 6 == 5)
{
Console.WriteLine("这个数字是:"
+ x.ToString());
}
}
Console.ReadKey();
}
再考虑:台阶阶梯总数加一是为2、3、5、6的最小公倍数,而且是7的倍数,所以定是30的倍数减1,可得如下算法:
view plain
copy to clipboard
print
?
static
void Main( string [] args)
{
int x;
for (
int i = 1; i < 10; i++)
{
if ((i * 30 - 1) % 7 == 0)
{
x = (i * 30 - 1);
Console.WriteLine("这个数字是:"
+ x.ToString());
}
}
Console.ReadKey();
}
助人生于自助。3w@live.cn
爱因斯坦曾出过这样一道有趣的数学题,有一个长阶梯,每步上2阶,最后剩1阶;若每步上3阶,最后剩2阶,若每步上5阶,后剩4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后一阶也不剩。问至少有多少阶阶梯?编写一个JAVA程序,解决该问题。
这个是我国古代的韩信点兵问题:古人用剩余定理口算或心算,我们现在有计算机了,算法很简单:
我以C#为例,Java非常类似。JAVA
view plaincopy to clipboardprint?
public static void main(String[] args) {
int x;
for (x = 0; x < 200; x++)
{
if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5 && x % 7 == 0)
{
System.out.print("这个数字是:" +x);
}
}
}
public static void main(String[] args) { int x; for (x = 0; x < 200; x++) { if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5 && x % 7 == 0) { System.out.print("这个数字是:" +x); } } }
说明:因为要取最小数,所以先设最大值100,无解,再设为200,得119
C#:
view plain
copy to clipboard
?
static
void Main( string [] args)
{
int x;
for (x = 0; x < 200; x++)
{
if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5 && x % 7 == 0)
{
Console.WriteLine("这个数字是:"
+ x.ToString());
}
}
Console.ReadKey();
}
static void Main(string[] args) { int x; for (x = 0; x < 200; x++) { if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5 && x % 7 == 0) { Console.WriteLine("这个数字是:" + x.ToString()); } } Console.ReadKey(); }
后来有朋友提起是7的倍数,
于是再优化下:
view plain
copy to clipboard
?
static
void Main( string [] args)
{
int x;
for (x = 0; x < 200; x = x + 7)
{
if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5)
{
Console.WriteLine("这个数字是:"
+ x.ToString());
}
}
Console.ReadKey();
}
static void Main(string[] args) { int x; for (x = 0; x < 200; x = x + 7) { if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5) { Console.WriteLine("这个数字是:" + x.ToString()); } } Console.ReadKey(); }
再考虑是奇数,更加简洁:
view plain
copy to clipboard
?
static
void Main( string [] args)
{
int x;
for (x = 7; x < 200; x = x + 14)
{
if ( x % 3 == 2 && x % 5 == 4 && x % 6 == 5)
{
Console.WriteLine("这个数字是:"
+ x.ToString());
}
}
Console.ReadKey();
}
static void Main(string[] args) { int x; for (x = 7; x < 200; x = x + 14) { if ( x % 3 == 2 && x % 5 == 4 && x % 6 == 5) { Console.WriteLine("这个数字是:" + x.ToString()); } } Console.ReadKey(); }
再考虑:台阶阶梯总数加一是为2、3、5、6的最小公倍数,而且是7的倍数,所以定是30的倍数减1,可得如下算法:
view plain
copy to clipboard
?
static
void Main( string [] args)
{
int x;
for (
int i = 1; i < 10; i++)
{
if ((i * 30 - 1) % 7 == 0)
{
x = (i * 30 - 1);
Console.WriteLine("这个数字是:"
+ x.ToString());
}
}
Console.ReadKey();
}
static void Main(string[] args) { int x; for (int i = 1; i < 10; i++) { if ((i * 30 - 1) % 7 == 0) { x = (i * 30 - 1); Console.WriteLine("这个数字是:" + x.ToString()); } } Console.ReadKey(); }
助人生于自助。3w@live.cn
相关文章推荐
- 韩信点兵问题的简单算法(downmoon)
- 韩信点兵问题的简单算法(downmoon)
- 经典算法——韩信点兵问题的简单算法
- 简单的算法问题1——塑泥课
- 简单的欧拉回路算法问题
- 关于 OnMouseWheelDown、OnMouseWheelUp 等事件的简单例子 - 回复 "巅枫" 的问题
- 牛羊吃草问题求解(downmoon)
- 简单的算法问题9——爬楼梯(动态规划)
- 读书-算法《程序设计导引及在线实践》-简单计算题5:装箱问题
- 算法笔记 简单贪心(月饼问题)
- 小白算法练习 简单背包问题专题004 多重背包 二进制化 POJ dp
- 简单贪心算法问题--找零钱
- 由一个简单算法想到的程序员素养问题
- Sparse Table算法 - RMQ问题的简单高效算法
- 一个简单的PHP算法问题!
- 由一个简单算法想到的程序员素养问题
- 最小生成树问题 普利姆算法简单模板 hdoj1233
- 简单0-1背包问题(算法类别:动态规划)
- 牛羊吃草问题求解(downmoon)
- 正整数中数字1的计数问题 - 简单算法(上)