#题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)