这里对之前几小结的知识通过习题的方式总结出来,这节将会实现四个小算法,分别是:
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
"""
水仙花数程序
Author: 大大洪大大
Time: 2019-5-21
"""
count = 0
for i in range(100, 1000):
a = i // 100 # 得到百位数字
b = (i % 100) // 10 # 得到十位数字
c = i % 10 # 得到个位数字
if(a ** 3 + b ** 3 + c ** 3 == i ):
count += 1
print("找到第%d个水仙花数:%d" % (count, i))
"""
output:
找到第1个水仙花数:153
找到第2个水仙花数:370
找到第3个水仙花数:371
找到第4个水仙花数:407
"""
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。
"""
寻找完全数
Author: 大大洪大大
Time: 2019-5-21
"""
number = 2
count = 0
while True:
sum = 0
end = int(number // 2) + 1
for i in range(1, end):
if number % i == 0:
sum += i
if sum == number:
count += 1
print("这是第%d个完全数:%d" % (count, number))
number += 1
"""
output:
这是第1个完全数:6
这是第2个完全数:28
这是第3个完全数:496
这是第4个完全数:8128
"""
程序还在跑,不知道第五个完全数要什么时候才能出来,估计要等好久好久了。。因为下一个完全数是33550336,再下一个是8,589,869,056,算了不想了。。。
我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
分析一下这里,大概使用三个for-in循环暴力解决就可以了。一百钱最多可以买公鸡20只,或者母鸡33只,或者小鸡300只,就可以动手写代码了。
"""
百钱百鸡问题
Author: 大大洪大大
Time: 2019-5-21
"""
for i in range(0, 21):
for j in range(0, 34):
for k in range(0, 301, 3):
if 5 * i + 3 * j + k / 3 == 100 and i + j + k == 100:
print("公鸡,母鸡,小鸡的数量分别是%d,%d,%d" % (i, j, k))
"""
以为答案是唯一的,但是结果得到四种,啊哈哈哈
output:
公鸡,母鸡,小鸡的数量分别是0,25,75
公鸡,母鸡,小鸡的数量分别是4,18,78
公鸡,母鸡,小鸡的数量分别是8,11,81
公鸡,母鸡,小鸡的数量分别是12,4,84
"""
"""
斐波拉切数列
Author: 大大洪大大
Time: 2019-5-21
"""
number = 100
first = 1
second = 1
print(first, end=' ')
print(second, end=' ')
for i in range(2, 100):
first, second = second, first
second = first + second
print(second, end=' ')
if i % 10 == 0:
print()
啊哈哈,一开始又用了一个临时变量temp来做一个交换,突然想到前面几节提到过的一个tip,在这里居然用上了。
现在我去看看原教程提供的代码,如果没有什么特别巧妙的地方,我就不更新了。
好吧,我考虑地还不是特别周到,很多细节是可以优化的,下面一一讲解一下。
水仙花数思路一模一样,也没什么讲的。我们来看看求完美数的算法。
for num in range(1, 10000):
sum = 0
for factor in range(1, int(math.sqrt(num)) + 1):
if num % factor == 0:
sum += factor
if factor > 1 and num / factor != factor:
sum += num / factor
if sum == num:
print(num)
在这里,它直接把算法的复杂度从O(n)讲到了O(logn),果然还是我太菜了。。。代码很好理解,我就不多解释了,长点记性就好。
“百钱百鸡”问题, 我以为没有比我的代码更简单的方法了,但是看到原教程的代码后我真的吐血了。。。不禁想到这就是菜鸡和大佬之间的区别吧。。。
"""
求解《百钱百鸡》问题
1只公鸡5元 1只母鸡3元 3只小鸡1元 用100元买100只鸡
问公鸡 母鸡 小鸡各有多少只
Version: 0.1
Author: 骆昊
Date: 2018-03-02
"""
for x in range(0, 20):
for y in range(0, 33):
z = 100 - x - y
if 5 * x + 3 * y + z / 3 == 100:
print('公鸡: %d只, 母鸡: %d只, 小鸡: %d只' % (x, y, z))
下一个是斐波那契数列数列。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
我特么。。。。。。。。。。。。。。。。。。。。。。。
"""
输出斐波那契数列的前20个数
1 1 2 3 5 8 13 21 ...
Version: 0.1
Author: 骆昊
Date: 2018-03-02
"""
a = 0
b = 1
for _ in range(20):
(a, b) = (b, a + b)
print(a, end=' ')
妙啊妙啊。。。。原来for循环还可以这样用,那个下划线也是惊艳到我了。这一节就这样吧,我去买包辣条压压惊。