题目:
打印出如下图案(菱形):
* *** ***** ******* ***** *** *
这道题我第一思路就是用格式化函数,因为他真的是太方便了,不多说,代码如下
star = [1,3,5,7]
for i in range(0,7):
if i <= 3:
print(f"{'*'*star[i]:^7}")
else:
print(f"{'*'*star[-(i-2)]:^7}")
对比原版代码及思路:
先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
程序源代码:
from sys import stdout
for i in range(4):
for j in range(2 - i + 1):
stdout.write(' ')
for k in range(2 * i + 1):
stdout.write('*')
print('')
for i in range(3):
for j in range(i + 1):
stdout.write(' ')
for k in range(4 - 2 * i + 1):
stdout.write('*')
print('')
虽然我知道他这样是一种思考的方法,但是他真的没有我方便
下一题~
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和
仔细分析这个数列,从第三项开始每一项都是的分子和分母前两项的和,直接建立四个向量,分别对应前两项的分子和分母,然后递归相加就行了
a1 = 2
a2 = 1
b1 = 3
b2 = 2
s1 = 0
for i in range(1,11):
s1 += a1/a2 + b1/b2
a1,a2 = a1+b1,a2+b2
b1,b2 = b1+a1,b2+a2
print(s1)
后来仔细分析发现,是我想得有点复杂了,从第二项开始,每一项的分子都是前一项分子与分母的和,分母就是前一项的分子,于是乎,代码变成了这样:
a = 2.0
b = 1.0
s = 0
for n in range(1,21):
s += a / b
t = a
a = a + b
b = t
print (s)
下一题~
求1+2!+3!+...+20!的和。
其实挺简单的,前提是你得知道这里这个感叹号是什么意思,不多说,上代码
先给你们看看我的代码:
s = 0
for i in range(1,21):
s1 = 1
while i >1:
s1 *= i
i = i-1
s += s1
print(s)
然后给你们看看答案:
n = 0
s = 0
t = 1
for n in range(1,21):
t *= n
s += t
print ('1! + 2! + 3! + ... + 20! = %d' % s)
他这个时间复杂度明显少了很多