zoukankan      html  css  js  c++  java
  • 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

    结果:

     

     

  • 相关阅读:
    牛客网-2019校招真题-跳格子游戏(斐波那契数列)
    牛客网-2019校招真题-学数学
    牛客网-2019校招真题-方格走法
    牛客网-2019年校招真题-通过率降序(二)
    牛客网-2019年校招真题-通过率降序(一)
    常用数据库连接URL的举例
    Css3-渐变
    清除浮动的方法
    html中的条件注释
    Css中的定位
  • 原文地址:https://www.cnblogs.com/banluqiaodaima/p/15620163.html
Copyright © 2011-2022 走看看