飞道的博客

python经典练习题之九九乘法表、打印菱形、打印对顶三角形、斐波拉契数列、素数...

389人阅读  评论(0)

学学习简单的练习,学到后面会有越来越多的解法来写!

作业的目的是为了让大家熟悉程序语言,锻炼将思路转换成程序逻辑。

九九乘法表

help(print)

先思考能不能打印出方阵

# 1 方阵


   
  1. # 1 方阵
  2. for i in range( 1, 10):
  3. line = ''
  4. for j in range( 1, 10):
  5. line += str(i) + '*' + str(j) + '=' + str(i*j) + ' '
  6. print(line)
  7. print( '-' * 30)

# 2 九九乘法表


   
  1. for i in range( 1, 10):
  2. for j in range( 1, 10):
  3. if i >= j:
  4. print(str(j) + '*' + str(i) + '=' + str(i*j), end= ' ')
  5. print()
  6. print( '-' * 30)

# 条件合并


   
  1. for i in range( 1, 10):
  2. for j in range( 1, i+ 1):
  3. print(str(j) + '*' + str(i) + '=' + str(i*j), end= ' ')
  4. print()
  5. print( '-' * 30)

# 3 九九乘法表 对齐


   
  1. for i in range( 1, 10):
  2. for j in range( 1, i+ 1):
  3. product = i * j
  4. product = str(product) + ' ' if j > 1 and product < 10 else str(product) #这里用表达式(python推荐用)
  5. print(str(j) + '*' + str(i) + '=' + product, end= ' ')
  6. print()
  7. print( '-' * 30)

# 4 九九乘法表 制表符对齐


   
  1. for i in range( 1, 10):
  2. for j in range( 1, i+ 1):
  3. print(str(j) + '*' + str(i) + '=' + str(i*j), end= '\t')
  4. print()
  5. print( '-' * 30)

# 5 使用字符串format方法


   
  1. for i in range( 1, 10):
  2. line = ''
  3. for j in range( 1, i+ 1):
  4. line += '{0}*{1}={2} '.format(j, i, i*j)
  5. print(line)
  6. print( '-' * 30)

# 5 对齐


   
  1. for i in range( 1, 10):
  2. line = ''
  3. for j in range( 1, i+ 1):
  4. line += '{0}*{1}={2:<2} '.format(j, i, i*j)
  5. print(line)
  6. print( '-' * 30)
  • {2:<2}对应i*j,:<2冒号是分割符号,<表示左对齐,2表示宽度

# 5 对齐改进


   
  1. for i in range( 1, 10):
  2. line = ''
  3. for j in range( 1, i+ 1):
  4. product = i * j
  5. line += '{}*{}={}{}'.format(j, i, product, ' ' if j > 1 and product < 10 else ' ')
  6. print(line)
  7. print( '-' * 30)

# 其它对齐


   
  1. for i in range( 1, 10): # row
  2. for j in range( 1, i+ 1): # column [ 1, i+ 1) 1 <= j <= i
  3. print( "{}*{}={}{}".format(j, i, i*j, ' ' if j== 2 and i< 5 else ''),
  4. end= '\n' if i == j else ' ')

扩展题:


   
  1. 1* 1= 1 1* 2= 2 1* 3= 3 1* 4= 4 1* 5= 5 1* 6= 6 1* 7= 7 1* 8= 8 1* 9= 9
  2. 2* 2= 4 2* 3= 6 2* 4= 8 2* 5= 10 2* 6= 12 2* 7= 14 2* 8= 16 2* 9= 18
  3. 3* 3= 9 3* 4= 12 3* 5= 15 3* 6= 18 3* 7= 21 3* 8= 24 3* 9= 27
  4. 4* 4= 16 4* 5= 20 4* 6= 24 4* 7= 28 4* 8= 32 4* 9= 36
  5. 5* 5= 25 5* 6= 30 5* 7= 35 5* 8= 40 5* 9= 45
  6. 6* 6= 36 6* 7= 42 6* 8= 48 6* 9= 54
  7. 7* 7= 49 7* 8= 56 7* 9= 63
  8. 8* 8= 64 8* 9= 72
  9. 9* 9= 81
  10. 请打印成上面的形式

# 打印九九乘法表方阵的上半部分


   
  1. for i in range( 1, 10):
  2. line = ''
  3. print( ' '* 7*(i -1), end= '') # 前置空格
  4. for j in range(i, 10):
  5. product = i * j
  6. line += '{}*{}={}{}'.format(i, j, product, ' ' if product < 10 else ' ')
  7. print(line)

下面采用右对齐方式,且分割均匀


   
  1. for i in range( 1, 10):
  2. line = ''
  3. for j in range(i, 10):
  4. line += '{}*{}={:<{}}'.format(i, j, i * j, 2 if j < 4 else 3)
  5. print( '{:>66}'.format(line))

打印如下菱形


   
  1. *
  2. ***
  3. *****
  4. *******
  5. *****
  6. ***
  7. *

思路:

看到规律了吗?


   
  1. for i in range( -3, 4):
  2. if i< 0:
  3. prespace = -i
  4. else:
  5. prespace = i
  6. print( ' '*prespace + '*'*( 7-prespace* 2))

把if语句改成三元表达式的样子,也可以使用abs(),内建绝对值函数


   
  1. for i in range( -3, 4):
  2. print( ' ' * abs(i) + '*' * ( 7 - 2 * abs(i)))

居中打印


   
  1. for i in range( -3, 4):
  2. print( "{:^7}".format( '*'*( 7 -2*abs(i))))

当然菱形也可以居中打印,请自行完成

打印闪电


   
  1. *
  2. **
  3. ***
  4. ********
  5. ***
  6. **
  7. *

分析如下:


   
  1. 行号 *个数 前空格 后空格数 总空格数 数据
  2. 1 1 3 3 6 -3
  3. 2 2 2 3 5 -2
  4. 3 3 1 3 4 -1
  5. 4 7 0 0 0 0
  6. 5 3 3 1 4 1
  7. 6 2 3 2 5 2
  8. 7 1 3 3 6 3

代码:


   
  1. for i in range( -3, 4):
  2. if i < 0:
  3. print( ' ' * (-i) + '*' * ( 4 + i))
  4. elif i > 0:
  5. print( ' ' * 3 + '*' * ( 4 - i))
  6. else:
  7. print( '*' * 7)
  8. #延时扩展
  9. n = 9
  10. e = n // 2
  11. x = n - e
  12. for i in range(-e, x):
  13. if i < 0:
  14. print( ' ' * -i + (x + i) * '*')
  15. elif i > 0:
  16. print( ' ' * e + (x - i) * '*')
  17. else: # i == 0
  18. print( '*' * n)

斐波那契数列,100以内

斐波那契数列_百度百科

斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式::F(n)=F(n-1)+F(n-2)

F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)

这是一个线性递推数列


   
  1. print( 0)
  2. print( 1)
  3. a = 0
  4. b = 1
  5. while True :
  6. c = a + b
  7. if c > 100 : break
  8. a = b
  9. b = c
  10. print(c)

求斐波那契数列第101项


   
  1. a = 1
  2. b = 1
  3. print( 'index={}, fib={}'.format( 0, 0))
  4. print( 'index={}, fib={}'.format( 1, a))
  5. print( 'index={}, fib={}'.format( 2, b))
  6. index = 2
  7. while True:
  8. c = a + b
  9. index += 1
  10. print( 'index={}, fib={}'.format(index, c))
  11. if index == 101: break
  12. a = b
  13. b = c
  14. # index= 101, fib= 573147844013817084101

求10万内的所有素数

此题的目的是为了让大家注意效率问题


   
  1. for x in range( 2, 100):
  2. for i in range( 2,x):
  3. if x % i == 0:
  4. break
  5. else:
  6. print(x)

为什么到一个数的“一半”就可以了


   
  1. for x in range( 2, 100000):
  2. for i in range( 2, int(x ** 0.5)+ 1):
  3. if x % i == 0:
  4. break
  5. else:
  6. print(x)

下面这段代码是错误代码,用x=4测试,因为内层循环缺少2,那么偶数就出了问题


   
  1. for x in range( 2, 100000):
  2. for i in range( 3, int(x ** 0.5)+ 1, 2):
  3. if x % i == 0:
  4. break
  5. else:
  6. print(x)

修改为


   
  1. for x in range( 3, 100000, 2): # 舍弃掉所有偶数
  2. for i in range( 3, int(x ** 0.5) + 1, 2): # 为什么从 3开始,且step为 2
  3. if x % i == 0:
  4. break
  5. else:
  6. print(x)

为什么从3开始,且step为2?

既然没有偶数,就不用和2取模了。

奇数%偶数能整除吗

利用素数性质:所有大于10的质数中,个位数只有1,3,7,9。


   
  1. count = 1
  2. for x in range( 3, 100000, 2): # 舍弃掉所有偶数
  3. if x > 10 and x % 10 == 5: # 所有大于 10的质数中,个位数只有 1, 3, 7, 9。意思就是大于 5,结尾是 5就能被 5整除了
  4. continue
  5. for i in range( 3, int(x ** 0.5) + 1, 2):
  6. if x % i == 0:
  7. break
  8. else:
  9. count += 1
  10. print(x, count) # 9592

如何计算时间,import datetime


   
  1. count = 0
  2. for x in range( 2, 100000):
  3. for i in range( 2,x):
  4. if x % i == 0:
  5. break
  6. else:
  7. count += 1
  8. print(count)
  9. # 9592

   
  1. count = 0
  2. for x in range( 2, 100000):
  3. for i in range( 2, int(x ** 0.5)+ 1):
  4. if x % i == 0:
  5. break
  6. else:
  7. count += 1
  8. print(count)
  9. # 9592

应用在密码学领域,都要使用大素数。

# 两种算法的对比的完整代码


   
  1. import datetime
  2. upper_limit = 100000
  3. delta = [ 0, 0]
  4. counts = [ 0, 0]
  5. start = datetime.datetime.now()
  6. for _ in range( 10):
  7. counts[ 0] = 0
  8. for x in range( 2,upper_limit):
  9. for i in range( 2, int(x ** 0.5)+ 1):
  10. if x % i == 0:
  11. break
  12. else:
  13. # print(x)
  14. counts[ 0] += 1
  15. delta[ 0] = (datetime.datetime.now() - start).total_seconds()
  16. start = datetime.datetime.now()
  17. for _ in range( 10):
  18. counts[ 1] = 1
  19. # print( 2)
  20. for x in range( 3,upper_limit, 2):
  21. for i in range( 3, int(x ** 0.5)+ 1, 2):
  22. if x % i == 0:
  23. break
  24. else:
  25. # print(x)
  26. counts[ 1] += 1
  27. delta[ 1] = (datetime.datetime.now() - start).total_seconds()
  28. print(delta, sep= "\t")
  29. print(counts, sep= "\t")

亲,需要你的“分享”“在看”

IT入门 感谢关注

程序员题库→

程序员用的单词表→

练习地址:www.520mg.com/it


转载:https://blog.csdn.net/bigzql/article/details/109665291
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场