37欲诺、回文數(shù) Ⅰ
題目:若一個數(shù)(首位不為0)從左到右讀與從右到左讀都是一樣,這個數(shù)就叫做回文數(shù)渺鹦,例如12521就是一個回文數(shù)扰法。
給定一個正整數(shù),把它的每一個位上的數(shù)字倒過來排列組成一個新數(shù)毅厚,然后與原數(shù)相加塞颁,如果是回文數(shù)則停止,如果不是吸耿,則重復(fù)這個操作祠锣,直到和為回文數(shù)為止。給定的數(shù)本身不為回文數(shù)咽安。
例如:87則有:
STEP1: 87+78=165
STEP2: 165+561=726
STEP3: 726+627=1353
STEP4: 1353+3531=4884
現(xiàn)在給你一個正整數(shù)M(12 <= M <= 100),輸出最少經(jīng)過幾步可以得到回文數(shù)伴网。如果在8步以內(nèi)(含8步)不可能得到回文數(shù),則輸出0妆棒。
例如:M=87澡腾,則輸出4.
參考答案:
M = 87
i = 0
while i <= 8:
if str(M) == str(M)[::-1]:
print(i)
break
else:
M = M + int(str(M)[::-1])
i += 1
if i == 9:
print(0)
38、回文數(shù) Ⅱ
題目:又是回文數(shù)糕珊!但這次有所不同了动分。
給定一個N進(jìn)制正整數(shù),把它的各位數(shù)字上數(shù)字倒過來排列組成一個新數(shù)红选,然后與原數(shù)相加澜公,如果是回文數(shù)則停止,如果不是喇肋,則重復(fù)這個操作坟乾,直到和為回文數(shù)為止。
如果N超過10苟蹈,使用英文字母來表示那些大于9的數(shù)碼糊渊。例如對16進(jìn)制數(shù)來說,用A表示10慧脱,用B表示11渺绒,用C表示12,用D表示13菱鸥,用E表示14宗兼,用F表示15。
例如:10進(jìn)制87則有:
STEP1: 87+78=165
STEP2: 165+561=726
STEP3: 726+627=1353
STEP4: 1353+3531=4884
給你一個正整數(shù)N(2<=N<=16)和字符串M("1"<=M<="30000"(10進(jìn)制)),表示M是N進(jìn)制數(shù)氮采,輸出最少經(jīng)過幾步可以得到回文數(shù)殷绍。
如果在30步以內(nèi)(含30步)不可能得到回文數(shù),則輸出0鹊漠。輸入的數(shù)保證不為回文數(shù)主到。
如N=10, M="87", 則輸出4.注意:M是以字符串的形式給定的茶行。
參考答案:
def s(a,n): # 10進(jìn)制數(shù)a變?yōu)閚進(jìn)制數(shù)(string)
d = {10:'A',11:'B',12:'C',13:'D',14:'E',15:'F'}
a,b = int(a),''
while a > 0:
if a % n < 10:
b += str(a % n)
else:
b += d[a % n]
a = a // n
return b[::-1]
def f(a,n): # n 進(jìn)制數(shù)變a為10進(jìn)制數(shù)(int)
d = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
a,b = str(a),0
a = a[::-1]
for i in range(len(a)):
if a[i] not in 'ABCDEF':
b += int(a[i])*n**i
else:
b += d[a[i]]*n**i
return b
def h(m,n):
step = 0
while str(m) != str(m)[::-1]:
m = f(m,n) + f(str(m)[::-1],n)
m = s(m,n)
step += 1
if step > 30:
return 0
break
return step
M,N = 87,10
print(h(M,N))
39、最小路徑和
題目:給你一個由非負(fù)整數(shù)組成的矩陣M登钥,請你找到一條從矩陣左上角到右下角的路徑畔师,使其和最小,并輸出最小路徑的和(注意:每次只能向右走或者向下走)牧牢。
例如:
M = [[1, 2, 3],
[1, 2, 3],
[1, 3, 3]]
則輸出:9
說明:最小路徑上的值分別為(1->1->1->3->3)看锉。
提示:動態(tài)規(guī)劃,還沒了解
其他參考答案:(難以想出)
M = [[1, 2, 3],
[1, 2, 3],
[1, 3, 3]]
L = M
s = len(L) # 行數(shù)
t = len(L[0]) # 列數(shù)
for i in range(s):
for j in range(t):
if i == 0 and j != 0:
L[i][j] += L[i][j-1] # 算出向右行駛的距離
if j == 0 and i != 0:
L[i][j] += L[i-1][j] # 算出向下走的距離
if i != 0 and j != 0:
L[i][j] += min(L[i-1][j],L[i][j-1]) # 從后向前推塔鳍,取最小
print(L[s-1][t-1])
40伯铣、歐拉函數(shù)1
題目:歐拉函數(shù)的定義是:對于n,Eurla(n)為與n互質(zhì)的小于n的正整數(shù)的個數(shù)。
給定n(n<=1000),輸出Eurla(n)
歐拉函數(shù)參考:https://blog.csdn.net/liuzibujian/article/details/81086324
參考代碼:
def yinzi(n):
yz = []
for i in range(1,n+1):
if n % i == 0:
yz.append(i)
return (yz)
n = 12
y0 = yinzi(n) # 求出n的所有因子
s = 0
for i in range(1,n):
y = yinzi(i) # 求出每一個比n小的數(shù)的因子
jiaoji = [j for j in y0 if j in y] # 求兩個因子集的交集
if jiaoji == [1]: # 如果交集只有1,則符合條件
s += 1
print(s)
求出這些數(shù):
def yinzi(n):
yz = []
for i in range(1,n+1):
if n % i == 0:
yz.append(i)
return (yz)
n = 12
y0 = yinzi(n) # 求出n的所有因子
s = 0
f = []
for i in range(1,n):
y = yinzi(i) # 求出每一個比n小的數(shù)的因子
jiaoji = [j for j in y0 if j in y] # 求兩個因子集的交集
if jiaoji == [1]: # 如果交集只有1,則符合條件
f.append(y)
m= []
for i in range(len(f)):
for b in f[i]:
if b not in m:
m.append(b)
print(m)