Python | 练习完全数 | 排序

#题8: 如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 
#例如:第一个完全数是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。
#那么问题来了,求1000以内的完全数有哪些?
#思路:循环取出每一个数;约数这个东西怎么表示:想象是否能假如数是n,那么如果n能整除比n小的数j,就给这些能整除的数j求和;
#求和,限制条件是j<n 因为要除去它本身6外
wan = []
for num in range(1, 1000):
    sum = 0
    for j in range(1, num):
        if num % j == 0 and j < num:
            sum = sum + j
    if num == sum:
        wan.append(num)
print("1000以内的完全数有:%s" % wan) 

1000以内的完全数有:[6, 28, 496]

#题9:用python写个冒泡排序
#思路:依次比较相邻两个元素,大的往后移,一趟只能把一个数移到最后一位,一共要走几趟,用for循环;
#每一趟相邻两个元素对比,然后交换值,用下标操作for循环
a = [1, 3, 10, 9, 21, 35, 4, 6]
for i in range(0, len(a)):
    for j in range(1, len(a) - i):
        if a[j - 1] > a[j]:
            a[j - 1], a[j] = a[j], a[j - 1]
        else:
            pass
print(a)

[1, 3, 4, 6, 9, 10, 21, 35]

a = [1, 3, 10, 9, 21, 35, 4, 6]
for i in range(0, len(a)):
    for j in range(1, len(a) - i):
        if a[j - 1] < a[j]:
            a[j - 1], a[j] = a[j], a[j - 1]
        else:
            pass
print(a)

[35, 21, 10, 9, 6, 4, 3, 1]

#思路:写一个函数,实现功能是传两个数,第一个数,第二个数是第一个数的位数,要求返回指定位数的值,如果没有这个位数,返回-1
#对于一个数,怎么返回每一位,思考可以把数变成字符串,用下标取值
def weishu(num, index):
    i = 1
    for i in range(1, index + 1):
        while index <= len(str(num)):
            a = num % 10
            num = num // 10
            return a
        else:
            return -1

num = int(input("请输入一个数"))
n1 = weishu(num, 1)
n2 = weishu(num, 2)
n3 = weishu(num, 3)
if num ==  n1**3 + n2**3 + n3**3:
    print("%d 是水仙花数" % num)
else:
    print("%d 不是水仙花数" % num)

请输入一个数153
153 不是水仙花数

def weishu(num, index):  #一般不要用拼音,可以是function_testcase1()之类,别人容易看懂的,这样代码易维护
    if index > len(str(num)):
        return -1    #一般会把特殊情况在最前边设置返回值,而不是用else
    ret = -1  #一般不要用a什么的,代码要清晰
    for i in range(0, index):  #控制循环的趟数
        ret = num % 10
        num = num // 10
    return ret

num = int(input("请输入一个数"))
n1 = weishu(num, 1)
n2 = weishu(num, 2)
n3 = weishu(num, 3)
if num ==  n1**3 + n2**3 + n3**3:
    print("%d 是水仙花数" % num)
else:
    print("%d 不是水仙花数" % num)

请输入一个数153
153 是水仙花数

#题10:已知一个队列[1, 3, 6, 9, 7, 3, 4, 6]
#按从小到大排序
#按从大大小排序
#去除重复数字
#思路:排序可以用冒泡;定义一个排序函数,功能从小到大排,调用函数后 按步长-1取所有 即从大到小排;也可以函数穿参时设置排序方式;
#去重:把列表转为集合,集合有唯一性,所以自动去重,再转为list;这步可以放到函数里
a = [1, 3, 6, 9, 7, 3, 4, 6]
b = a[::-1]
b

[6, 4, 3, 7, 9, 6, 3, 1]

def founction_sort(list_name, sort_mode):
    for i in range(0, len(list_name)):
        for j in range(1, len(list_name) - i):
            if a[j - 1] > a[j]:
                a[j], a[j - 1] = a[j - 1], a[j]
    List_RemoveDup = list(set(list_name))
    if sort_mode == 1:
        return List_RemoveDup
    else:
        return List_RemoveDup[::-1]

a = [1, 3, 6, 9, 7, 3, 4, 6]
Asc_a = founction_sort(a, 1)
Desc_a = founction_sort(a, -1)
Asc_a, Desc_a

([1, 3, 4, 6, 7, 9], [9, 7, 6, 4, 3, 1])

#题11:计算n!,例如n=3(计算321=6), 求10!
#思路:for循环 1*2*3*4一直到10
result = 1
n = int(input("请输入要计算的数"))
if n == 0 or n ==1:
    print("%d! = %d" % (n, 1))
for i in range(1, n + 1):
    result = result * i
print("%d! = %d" % (n, result))

请输入要计算的数10
10! = 3628800

#题12:已知一个数列:1、1、2、3、5、8、13、。。。。的规律为从3开始的每一项都等于其前两项的和,这是斐波那契数列。
#求满足规律的100以内的所有数据
#思路:
a = 0
b = 1
while b < 3:
    print("b = %d"%b, end=",")
    print("a = %d"%a, end="\n\n")
    a, b = b, a+b
    print("哈哈哈哈哈哈b = %d"%b, end=";")
    print("a = %d"%a, end="\n\n")



b = 1,a = 0

哈哈哈哈哈哈b = 1;a = 1

b = 1,a = 1

哈哈哈哈哈哈b = 2;a = 1

b = 2,a = 1

哈哈哈哈哈哈b = 3;a = 2

i = 0
j = 1
list_name = []
while j < 100:
    list_name.append(j)
    i, j = j, i + j
print(list_name)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值