part4-3 分支结构 、循环结构练习

1、使用循环输出九九乘法表。输出样式结果如下:
1 x 1 = 1
1 x 2 = 2, 2 x 2 = 4
......
1 x 9 = 9, 2 x 9 = 18, 3 x 9 = 27, ... , 9 x 9 = 81

1 for i in range(1, 10):
2     for j in range(1, i+1):
3         if j == i:
4             print("%d x %d = %-2d" % (j, i, j * i), end="")
5         else:
6             print("%d x %d = %-2d" % (j, i, j * i), end=", ")
7     print()

2、使用循环输出等腰三角形。例如给定4,输出如下结果:
   *
***
*****
*******
1 lines = int(input("输入要打印的行数:"))
2 for i in range(lines):
3     for _ in range(1, lines - i):
4         print(end=" ")
5     for _ in range(2 * i + 1):
6         print("*", end="")
7     print()

3、给定一个奇数,例如3,输出横、竖、斜的总和相等:
08 01 06
03 05 07
04 09 02
例如给出数字5,输出是:
17 24 01 08 15
23 05 07 14 16
04 06 13 20 22
10 12 19 21 03
11 18 25 02 09

代码示例如下:
 1 size = int(input("请输入一个奇数:"))
 2 if size % 2 != 1:
 3     exit("输入的不是奇数,程序结束!")
 4 # 创建一个长度 size * size 的二维列表
 5 array = [[0] * size]
 6 for i in range(size - 1):
 7     array += [[0] * size]
 8 row, col = 0, size // 2         # 数字 1 填在第一行的中间
 9 for i in range(1, size * size + 1):
10     array[row][col] = i
11     if i % size == 0:   # 能整除时,行号加1,列号不变,往下填数字
12         row += 1
13     elif row == 0:      # 如果行号(row)等于0,就跳转到最后一行,并且列号加 1
14         row = size - 1
15         col += 1
16     elif col == size - 1:   # 如果行号不等于0,列号到达最右边,就移动上一行的最左边
17         row -= 1
18         col = 0
19     else:       # 从左下角往右上角填数字
20         row -= 1
21         col += 1
22 maxnum = size * size
23 if maxnum < 100:
24     for i in range(size):
25         for j in range(size):
26             print('%02d' % array[i][j], end=" ")
27         print()
28 else:
29     maxnumstr = "%0" + str(len(str(maxnum))) + "d"
30     for i in range(size):
31         for j in range(size):
32             print(maxnumstr % array[i][j], end=" ")
33         print()

4、使用循环输出菱形,例如输入7,输出如下结果,如果输入偶数提示不能打印:
   *
***
*****
*******
*****
***
*
根据规律,菱形可从中间分开,分为上半部分和下半部分,上半部分左边的空格依次减少,星号(*)是 2 * i + 1 的规律增加。下半部分左边的空格依次增加,星号是 line - 2 - 2 * j 的规律减少。用代码实现如下:
 1 line = int(input("请输入菱形的行数,输入偶数不能打印:"))
 2 if line % 2 == 0:
 3     exit("输入的是偶数,不能打印!")
 4 half_line = line // 2 + 1       # 从中间分开,分上半部分和下半部分
 5 for i in range(half_line):
 6     # 打印上半部分
 7     print(" " * (half_line - i - 1), end="")
 8     print("*" * (2 * i + 1))
 9 for j in range(half_line - 1):
10     # 打印下半部分
11     print(" " * (j + 1), end="")
12     print("*" * (line - 2 - 2 * j))

5、使用循环输出空心菱形,提示只能输入奇数,例如输入7,输出如下结果
   *
* *
* *
* *
* *
* *
*
找规律:将菱形分为上半部分和下半部分。上半部分左边的空格从上到下依次减少(half_line - i - 1),下半部分左边空格依次增多(i + 1)。上半部分星号之间的空格依次增加(2*i-1),下半部分星号之间的空格依次减少(line-4-2*i)。代码如下:
 1 line = int(input("请输入要打印的行数(奇数):"))
 2 if line % 2 == 0:
 3     exit("输入的是偶数,不能打印!")
 4 half_line = line // 2 + 1
 5 # 打印上半部分
 6 for i in range(half_line):
 7     print(" " * (half_line - i - 1), end="")
 8     if i == 0:
 9         print("*")
10     else:
11         print("*", end="")
12         print(" " * (2 * i - 1), end="")
13         print("*")
14 # 打印下半部分
15 for j in range(half_line - 1):
16     print(" " * (j + 1), end="")
17     # 判断是否到最后一行
18     if j == half_line - 2:
19         print("*")
20     else:
21         print("*", end="")
22         print(" " * (line - 4 - 2 * j), end="")
23         print("*")

6、用户输入成绩,程序自动判断出成绩的类型:成绩>=90分用A表示,80~89分用B表示,70~79分用C表示,其他用D表示。
 1 while True:
 2     score = input("请输入你的成绩:")
 3     if score == 'exit' or score == 'q':
 4         exit()
 5     s = float(score)
 6     if s >= 90:
 7         print("A")
 8     elif 89 >= s >= 80:
 9         print("B")
10     elif 79 >= s >= 70:
11         print("C")
12     else:
13         print("D")

7、判断101~200之间有多少个素数(质数),并输出所有的素数(质数)。
 1 prime_num = []
 2 start = 101
 3 end = 200
 4 for i in range(start, end):
 5     is_prime = True     # 通过使用标志位来判断是否是素数
 6     for j in range(2, int(i ** 0.5) + 1):
 7         if i % j == 0:
 8             is_prime = False
 9     if is_prime:
10         prime_num.append(i)
11 print(prime_num)

8、打印水仙花数,水仙花数是指一个三位数,其各位数字的立方和等于该数本身。例如,153是一个水仙花数,
153=1**3 + 5**3 + 3**3
 1 # 方法一,打印三位数中的水仙花数
 2 start = 101
 3 end = 1000
 4 for i in range(start, end):
 5     bai = i // 100      # 取百位数
 6     # 取十位数和个位数
 7     shi, ge = (i - bai * 100) // 10, i % 10
 8     if bai ** len(str(i)) + shi ** len(str(i)) + ge ** len(str(i)) == i:
 9         print(i)
10 
11 # 方法二:打印1~1千万个数中的水仙花数
12 start = 1
13 end = 10 ** 7
14 for i in range(start, end + 1):
15     sm = 0
16     for j in str(i):
17         sm += (ord(j) - 48) ** len(str(i))
18     if sm == i:
19         print(i)
20 
21 # 方法三:使用列表推导式
22 daffo_num = [j for j in range(1, 10 ** 5)
23              if sum([(ord(i) - 48) ** len(str(j)) for i in str(j)]) == j]
24 print(daffo_num)

9、输入一行字符,分别统计出其中英文字母、空格、数字和其他字符个数。
 1 s = input("请输入一行字符:")
 2 char_num, digit_num, space_num, other_num = 0, 0, 0, 0
 3 for c in s:
 4     if c.isdigit(): digit_num += 1
 5     elif c.isalpha(): char_num += 1
 6     elif c.isspace(): space_num += 1
 7     else: other_num += 1
 8 print("字母个数:", char_num)
 9 print("数字个数:", digit_num)
10 print("空格个数:", space_num)
11 print("其他字符个数:", other_num)

10、打印近似圆,只要给定不同的半径,圆的大小就会随之发生改变。
1 raidus = int(input("请输入圆的半径:"))
2 for i in range(2 * raidus + 1):
3     half = round((raidus ** 2 - (raidus - i) ** 2) ** 0.5)
4     print("  " * (raidus - half), end="")
5     print("*", end="")
6     print("  " * half * 2, end="")
7     print("*")

11、输入一半的行数,输出对称字符,例如输入3,输出:
----c----
--c-b-c--
c-b-a-b-c
--c-b-c--
----c----
代码如下:
 1 line = int(input("请输入一半的行数:"))
 2 # 打印上半部分
 3 for i in range(line):
 4     print("-" * (line * 2 - 2 - 2 * i), end="")
 5     my_list = []
 6     for j in range(i + 1):
 7         my_list.append(chr(96 + line - j))
 8     for j in range(i):
 9         my_list.append(chr(ord(my_list[-1]) + 1))
10     print("-".join(my_list), end="")
11     print("-" *  (line * 2 - 2 - 2 * i))
12 # 打印下半部分
13 for i in range(line - 1):
14     print("-" * (2 * (i + 1)), end="")
15     # 换一种方式初始化列表
16     my_list = [chr(96 + line - j) for j in range(line - 1 - i)]
17     for j in range(line - 2 - i):
18         my_list.append(chr(ord(my_list[-1]) + 1))
19     print("-".join(my_list), end="")
20     print("-" * (2 * (i + 1)))

猜你喜欢

转载自www.cnblogs.com/Micro0623/p/11526940.html