几个算法的练习题,重在锻炼解决问题的步骤和方法。
练习一:寻找水仙花
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)
# _*_ coding: utf-8 _*_
__author__ = 'ing'
__date__ = '2019-07-15 15:18'
"""寻找100-999间的水仙花数
水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
// python3中表示整数除法 / 表示浮点数除法
"""
for num in range(100, 1000):
low = num % 10
mid = num // 10 % 10
high = num // 100
if num == low ** 3 + mid ** 3 + high ** 3:
print(num)
练习二:寻找完美数
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。
方法一,完全直译其概念写法,效率较低
# _*_ coding: utf-8 _*_
__author__ = 'ing'
__date__ = '2019-07-15 23:27'
"""
找出1~9999之间的所有完美数
完美数是除自身外其他所有因子的和正好等于这个数本身的数
例如: 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14
"""
for num in range(1, 10000):
sum = 0
for factor in range(1, num):
# 判断factor是否是sum的因子
if num % factor == 0:
sum += factor
if sum == num:
print(num)
方法二:对于某一整数来说,其最大因子为n/2 (若n为偶数时,若为奇数最大因子小于n/2),在n/2〜n-1范围内没有数据可以整除此数。据此,我们可以把遍历范围缩小至1〜n-1,这样程序效率可以提高一倍
# _*_ coding: utf-8 _*_
__author__ = 'ing'
__date__ = '2019-07-15 23:27'
"""
找出1~9999之间的所有完美数
完美数是除自身外其他所有因子的和正好等于这个数本身的数
例如: 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14
"""
import math
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)
网友评论