python刷题—转换编程思想到python!

来源:互联网 发布:可以看腐剧的软件 编辑:程序博客网 时间:2024/06/14 02:55

1、0~9这10个数字可以组成多少不重复的3位数?(三个数都不一样)

#-*-coding:utf-8-*-num = 0for i in range(100,1000):    if str(i)[0] != str(i)[1] and str(i)[0] != str(i)[2] and str(i)[1] != str(i)[2]:        num += 1print("可以组成",num,"个不重复的数字")

2、水仙花数(自幂数)

水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。例如:1^3+5^3+3^3=153。求100~999之间所有的水仙花数。
#-*-coding:utf-8-*-list_num = []for i in range(100, 1000):    i_1 = i % 10    i_2 = i % 100 / 10    i_3 = i / 100    if i == i_1 ** 3 + i_2 ** 3 + i_3 ** 3:        list_num.append(i)    else:        passprint("100-1000所有的水仙花数为", list_num)

3、
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。例如,第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。编程求10000以内的完全数。
(上方注释部分我自己实现,下方我pythonic版的实现,学习思路和python思想!)
#-*-coding:utf-8-*-'''import numpy as npperfect_list = []for i in range(1,10001):    list_i = [1]    sum_i = 0    for j in range(2,int(np.sqrt(i)) + 1):        for k in range(j,i + 1):            if j * k == i:                list_i.append(j)                list_i.append(k)            else:                pass    for value in list_i:        sum_i += value    if sum_i == i:        perfect_list.append(i)    else:        passprint("10000以内完全数有:", perfect_list)'''list_num = []num = 10000for i in range(1,num + 1):    if (sum([j for j in range(1,i) if i % j == 0])) == i:        list_num.append(i)print("10000以内完全数有", list_num)

4、相亲数

220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284284的真因数之和为1+2+4+71+142=220毕达哥拉斯把这样的数对A、B称为相亲数:A的真因数之和为B,而B的真因数之和为A。求100000以内的相亲数。
#-*-coding:utf-8-*-date_list = []num = 10000for i in range(1,num):    dict_date = {}    data2 = sum([j for j in range(1,i) if i % j == 0])    if i == sum([k for k in range(1, data2) if data2 % k == 0]):        dict_date[i] = data2        #剔除掉结果中键和值相等的字典对和两个字典变量中键和值互为相等中的一个({220: 284}, {284: 220})        if i < data2:            date_list.append(dict_date)        else:            pass    else:        passprint("between 1 to 10000's date number are: ", date_list)

5、

黑洞数

黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同的整数,经限“重排求差”操作,总会得到某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。举个例子,3位数的黑洞数为495.简易推导过程:随便找个数,如297,3个位上的数从小到大和从大到小各排一次,为972和279,相减得693。按上面做法再做一次,得到594,再做一次,得到495,之后反复都得到495。验证4位数的黑洞数为6174。
我的代码:
import randomfrom itertools import permutationsbite_num = 5flag = str(random.randint(10000,99999))list_num = []for i in range(bite_num):    list_num.append(flag.strip()[i])permu_list = list(permutations(list_num, bite_num))for i, index in enumerate(permu_list,0):    temp = "".join(index)    permu_list[i] = int(temp)result = str(max(permu_list) - min(permu_list))while flag != result:    flag = result    list_num = []    for i in range(bite_num):        list_num.append(flag.strip()[i])    permu_list = list(permutations(list_num, bite_num))    for i, index in enumerate(permu_list,0):        temp = "".join(index)        permu_list[i] = int(temp)    result = str(max(permu_list) - min(permu_list))print("四位数的黑洞数为:", result)


更pythonic的代码:
import randomdef func(n):    a = [int(i) for i in str(n)]    a.sort()    s1 = reduce(lambda x, y : 10 * x + y, a[::-1])    s2 = reduce(lambda x, y : 10 * x + y, a)    return n if s1 - s2 == n else func(s1 - s2)n = str(random.randint(1000,10000))print("res:", func(n))


原创粉丝点击