阶段练习(1)

这里对之前几小结的知识通过习题的方式总结出来,这节将会实现四个小算法,分别是:

  1. 寻找“水仙花数”

水仙花数(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
"""
  1. 寻找“完美数”

完全数(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,算了不想了。。。

  1. “百钱百鸡”问题

我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

分析一下这里,大概使用三个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
"""
  1. 生成“斐波拉切数列”
"""
斐波拉切数列
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循环还可以这样用,那个下划线也是惊艳到我了。这一节就这样吧,我去买包辣条压压惊。

上一节: 循环结构
下一节:函数和模块的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值