Python挑战100题(37~40)

37、回文数 Ⅰ

题目:若一个数(首位不为0)从左到右读与从右到左读都是一样,这个数就叫做回文数,例如12521就是一个回文数。
给定一个正整数,把它的每一个位上的数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,如果不是,则重复这个操作,直到和为回文数为止。给定的数本身不为回文数。
例如:87则有:
STEP1: 87+78=165
STEP2: 165+561=726
STEP3: 726+627=1353
STEP4: 1353+3531=4884
现在给你一个正整数M(12 <= M <= 100),输出最少经过几步可以得到回文数。如果在8步以内(含8步)不可能得到回文数,则输出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、回文数 Ⅱ

题目:又是回文数!但这次有所不同了。
给定一个N进制正整数,把它的各位数字上数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,如果不是,则重复这个操作,直到和为回文数为止。
如果N超过10,使用英文字母来表示那些大于9的数码。例如对16进制数来说,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。
例如:10进制87则有:
STEP1: 87+78=165
STEP2: 165+561=726
STEP3: 726+627=1353
STEP4: 1353+3531=4884
给你一个正整数N(2<=N<=16)和字符串M("1"<=M<="30000"(10进制)),表示M是N进制数,输出最少经过几步可以得到回文数。
如果在30步以内(含30步)不可能得到回文数,则输出0。输入的数保证不为回文数。
如N=10, M="87", 则输出4.注意:M是以字符串的形式给定的。
参考答案:

def s(a,n):     # 10进制数a变为n进制数(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 进制数变a为10进制数(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、最小路径和

题目:给你一个由非负整数组成的矩阵M,请你找到一条从矩阵左上角到右下角的路径,使其和最小,并输出最小路径的和(注意:每次只能向右走或者向下走)。
例如:
M = [[1, 2, 3],
[1, 2, 3],
[1, 3, 3]]
则输出:9
说明:最小路径上的值分别为(1->1->1->3->3)。
提示:动态规划,还没了解
其他参考答案:(难以想出)

M = [[1, 2, 3],
     [1, 2, 3],
     [1, 3, 3]]
L = M
s = len(L) # 行数
t = len(L[0]) # 列数

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、欧拉函数1

题目:欧拉函数的定义是:对于n,Eurla(n)为与n互质的小于n的正整数的个数。
给定n(n<=1000),输出Eurla(n)
欧拉函数参考: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小的数的因子
    jiaoji = [j for j in y0 if j in y] # 求两个因子集的交集
    if jiaoji == [1]:   # 如果交集只有1,则符合条件
        s += 1
print(s)

求出这些数:

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小的数的因子
    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)

你可能感兴趣的:(Python挑战100题(37~40))