水仙花数
水仙花数是各位立方和等于这个数本身的数 abc = a*a*a+b*b*b+c*c*c 例如 153 = 1*1*1 + 5*5*5 + 3*3*3 示例1
'''找出100~999之间的所有水仙花数'''for num in range(100, 1000): # 遍历100到999 low = num % 10 # 除10取余数是个位数 mid = num // 10 % 10 # 除10取模 再除10取余数是十位数 high = num // 100 # 除100取模 是百位数 if num == low ** 3 + mid ** 3 + high ** 3: # 计算各个位数的立方和 print(num) # 输出水仙花数
完美数
完美数是除自身外其他所有因子的和正好等于这个数本身的数
例如 6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
示例2
'''找出1~9999之间的所有完美数第一种方案1 遍历1-9999, 列表 range(1,10000)2 假设当前遍历值n, 二次遍历1到 n的平方根+13 假设二次遍历值m, 判断m是不是n的因子(取余为0),如果是,计算因子m的加和4 如果m是n的因子,当m大于1并且不是n的平方根时, 那么m*k = n, k是另外的一个因子,将k加和5 二次遍历结束后,判断因子的加和是否等于n, 如果相等,则n是完美数6 继续遍历1-9999'''import timeimport mathstart = time.perf_counter()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 1 < factor != num / factor: sum += num / factor if sum == num: print(num)end = time.perf_counter()print("方案一 执行时间:", (end - start), "秒")'''第二种方案'''start2 = time.perf_counter()for num in range(1, 10000): sum = 0 for factor in range(1, num//2 + 2): if num % factor == 0: sum += factor if sum == num: print(num)end2 = time.perf_counter()print("方案二 执行时间:", (end2 - start2), "秒")'''16284968128方案一 执行时间: 0.0710596 秒16284968128方案二 执行时间: 2.4442378 秒通过比较上面两种不同的解决方案的执行时间 意识到优化程序的重要性'''
百元百鸡
1只公鸡5元 1只母鸡3元 3只小鸡1元 用100元买100只鸡 问公鸡 母鸡 小鸡各有多少只? 示例3
'''1 假设公鸡 x只,母鸡 y 只, 小鸡z 只2 公鸡一只5元, 公鸡的数量必须在 0-19之间3 母鸡一只3元, 母鸡的数量必须在 0-33之间4 总共100只鸡, 小鸡的数量是100-x-y5 总共花费100元,所以5x+3y+(100-x-y)/3 = 1006 遍历x,y的取值范围,如果等式5成立,那么此次遍历的x,y,z就是购买的数量'''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))'''要理解程序背后的算法 - 穷举法公鸡: 0只, 母鸡: 25只, 小鸡: 75只公鸡: 4只, 母鸡: 18只, 小鸡: 78只公鸡: 8只, 母鸡: 11只, 小鸡: 81只公鸡: 12只, 母鸡: 4只, 小鸡: 84只'''