天天看點

驗證6174猜想(枚舉法)---Python

使用枚舉法驗證 6174猜想:

1955年,卡普耶卡(D.R.Kaprekar)對4位數字進行了研究,發現一個規律:對任意各位數字不相同的4位數,使用各位數字能組成的最大數減去能組成的最小數,對得到的差重複這個操作,最終會得到6174這個數字,并且這個操作最多不會超過7次。

使用語言: Python

思路: 對于每一個四位數,将其各個位數放入一個清單中,此清單升序後拼成的數字為最小數,此清單降序後拼成的數字為最大數。利用循環,反複進行操作;差不等于6174則将其分解放入清單中,求得最大小值後相減得差。

!此猜想隻針對各位數字不相同的4位數

代碼:

def sws(l):     #将清單中數按順序組成四位數
    y=l[0]*1000+l[1]*100+l[2]*10+l[3]
    return y
def jian(l):    #最大數-最小數
     l.sort()
     n1=sws(l)
     l.sort(reverse=True)
     n2=sws(l)
     t=(n2-n1)
     return t
def f(n):      #将四位數各位取出放入清單
    x=n//1000
    y=n//100%10
    z=n%100//10
    m=n%10
    l=[]
    l.append(x)
    l.append(y)
    l.append(z)
    l.append(m)
    return l
def jd(x):
     l=f(x)
#for i in range(0,4):
#    x=int(input())
#    l.append(x)
     a=jian(l)
     i=1
     while(a!=6174):
            a=jian(f(a))
            i+=1
     if i<8:
            print(x,"最終得到6174操作次數:",i)
     else:
            print(x,"最終得到6174這個數字的操作超過7次。")
for x in range(1000,10000):
    l=f(x)
    if l[0]!=l[1] and l[0]!=l[2] and l[0]!=l[3]and l[1]!=l[2]and l[1]!=l[3]and l[2]!=l[3]:
          jd(x)
           

若不想枚舉,隻想驗證某位四位數可将代碼中注釋部分改為非注釋部分。

因為是枚舉法,最後運作結果數量很多,此處隻截一部分圖。

驗證6174猜想(枚舉法)---Python