Python练习(Q6) 改版考拉兹猜想
题目:(题目来源:程序员的算法趣题)
对自然数n执行如下操作:
1: 若n是偶数,用n除以2
2: 若n是奇数,用n乘以3后加1
如此循环操作的话,无论初始值是什么,最终都会得到1(会进入1-->4-->2-->1)的循环
考虑稍微修改一下以上迭代的规则。当初始状态是偶数的话,第一次也用n乘以3加1,其后迭代规则不变。
求在10000以内的偶数中总共有多少个数,经过以上修改的迭代规则能够回到初始状态的?具体参考下面举例:
考虑到循环的终止条件就是最后一个数回到1或者回到第一个偶数,即可。
上代码:
import numpy as np import datetime from numpy.lib.arraysetops import unique data=np.arange(20000,dtype=np.int32) data=data[2:10000:2] print(data) def CounterData(num): allnam=[] allnam.append(num) first=num*3+1 allnam.append(first) while(len(unique(allnam))==len(allnam)): temp=allnam[-1] if(temp%2==0): #偶数 temp=int(allnam[-1]/2) else: #奇数 temp=allnam[-1]*3+1 allnam.append(temp) if(allnam[-1]==allnam[0]): return num start = datetime.datetime.now() result=[] for item in data: temp=CounterData(item) if(temp!=None): result.append(temp) print("*"*100) print("All Num Count:=") print(len(result)) end = datetime.datetime.now() spendtime=end-start print("CounterData(item) Spend time:{}".format(spendtime.microseconds)) print("*"*100) def CounterData2(num): allnam=[] allnam.append(num) first=num*3+1 allnam.append(first) while(allnam[-1]!=1): temp=allnam[-1] if(temp%2==0): #偶数 temp=int(allnam[-1]/2) else: #奇数 temp=allnam[-1]*3+1 allnam.append(temp) if(allnam[-1]==allnam[0]): return num start = datetime.datetime.now() result=[] for item in data: temp=CounterData2(item) if(temp!=None): result.append(temp) print("*"*100) print("All Num Count:=") print(len(result)) end = datetime.datetime.now() spendtime=end-start print("CounterData2(item) Spend time:{}".format(spendtime.microseconds)) print("*"*100)
结果: