用“动态规划”的思想求解,其实很方便。
要求的数需要被1~20内所有的数整除,那么化繁为简,如果只要求这个数被1~2整除,那么这个数就是1和2的最小公倍数,1~3整除就是1~2的最小公倍数与3的最小公倍数,以此类推一直到20,所以题目就可以简化成求2个数的最小公倍数,然后循环20次就完了。
go代码:package main
import (
"fmt"
"math"
"time"
)
//题目5:
//
//2520 是最小的能被 1-10 中每个数字整除的正整数。
//
//最小的能被 1-20 中每个数整除的正整数是多少?
func max_elem(a, b int64) int64 {
x := int64(math.Max(float64(a), float64(b)))
y := int64(math.Min(float64(a), float64(b)))
t := x % y
for {
if t != 0 {
x = y
y = t
t = x % y
} else {
return y
}
}
}
func min_fact(a, b int64) int64 {
return a * b / max_elem(a, b)
}
func main() {
t := time.Now()
var i, j int64 = 2, 1
for i = 2; i < 21; i++ {
j = min_fact(j, i)
}
fmt.Println(j)
tt := time.Now()
fmt.Println("耗时:", (tt.Nanosecond()-t.Nanosecond())/1e6, "ms")
}
输出:C:\Users\Anaconda\GolandProjects\EulerProject\output\go_build_Euler05_go.exe
232792560
耗时: 0 ms
进程 已完成,退出代码为 0
1毫秒都不用 |