标签:修改 执行 for循环 数字 自然数 pen 个数 pack 数学
“考拉兹猜想”是一个数学上的未解之谜。考拉兹猜想
对自然数 n 循环执行如下操作。
- n 是偶数时,用 n 除以 2
- n 是奇数时,用 n 乘以 3 后加 1
如此循环操作的话,无论初始值是什么数字,最终都会得到 1(会进入1 → 4 → 2 → 1 这个循环)。
这里我们稍微修改一下这个猜想的内容,即假设初始值为偶数时,也用 n 乘以 3 后加 1,但只是在第一次这样操作,后面的循环操作不变。而我们要考虑的则是在这个条件下最终又能回到初始值的数。
譬如,以2为初始值,则计算过程如下。
2?→?7?→?22?→?11?→?34?→?17?→?52?→?26?→?13?→?40?→?20?→?10?→?5?→ 16?→?8?→?4?→?2
同样,如果初始值为4,则计算过程如下。
4?→?13?→?40?→?20?→?10?→?5?→?16?→8?→?4
但如果初始值为6,则计算过程如下,并不能回到初始值6。
6?→?19?→?58?→?29?→?88?→?44?→?22?→?11?→?34?→?17?→?52?→?26?→?13 →40?→?20?→?10?→?5?→?16?→?8?→?4?→?2?→?1?→?4?→?…
问题
求在小于 10000 的偶数中,像上述的 2 或者 4 这样“能回到初始值的数”有多少个。
package main
import "fmt"
func collatz(n int)bool{
m := n * 3 + 1
for{
if m == 1{
return false
}else if m == n{
return true
}
if m % 2 == 1{
m = m * 3 + 1
}else if m % 2 == 0{
m = m / 2
}
}
}
func main(){
var s []int
for i:=2;i<10001;i+=2{
if collatz(i){
s = append(s, i)
}
}
fmt.Println(s)
fmt.Printf("共 %d 个数\n", len(s))
}
结果:
[2 4 8 10 14 16 20 22 26 40 44 52 106 184 206 244 274 322 526 650 668 790 866 976 1154 1300 1438 1732 1780 1822 2308 2734 3238 7288]
共 34 个数
本来用递归函数,发现有些麻烦,就用了for循环,发现很容易就搞定了,只需注意跳出循环的条件设计就好。
标签:修改 执行 for循环 数字 自然数 pen 个数 pack 数学
原文地址:http://blog.51cto.com/johnnyloo/2137372