美文网首页
Python挑战100题(37~40)

Python挑战100题(37~40)

作者: YoYoYoo | 来源:发表于2019-08-28 09:38 被阅读0次

    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)

          本文链接:https://www.haomeiwen.com/subject/gppusctx.html