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) 
View Code

结果:

 

 

posted on 2021-11-29 16:42  半路敲代码  阅读(392)  评论(0编辑  收藏  举报

导航