練習題 1 成績等級 要求輸出成績等級A、B、C、D、E, 其中90-100分為A,80-89分為B,70-79分為C,60-69分為D,60分以下為E。 要求: - 用If語句實現; - 輸入百分製成績後要判斷該成績的合理性,對不合理的成績應輸出出錯信息。 參考答案: while True: co ...
練習題 1
成績等級
要求輸出成績等級A、B、C、D、E,
其中90-100分為A,80-89分為B,70-79分為C,60-69分為D,60分以下為E。
要求:
- 用If語句實現;
- 輸入百分製成績後要判斷該成績的合理性,對不合理的成績應輸出出錯信息。
參考答案:
while True:
content = input("請輸入成績:")
if not content.isdigit():
print("您輸入的成績格式錯誤,請輸入一個0-100之間的數字。")
continue
elif not 0 <= int(content) <= 100:
print("您輸入的成績格式錯誤,請輸入一個0-100之間的數字。")
continue
else:
break
score = ""
if int(content) < 60:
score = "E"
elif 60 <= int(content) <= 69:
score = "D"
elif 70 <= int(content) <= 79:
score = "C"
elif 80 <= int(content) <= 89:
score = "B"
else:
score = "A"
print("您的成績等級為:%s" % (score,))
練習題 2
預判比賽結果
籃球比賽是高分的比賽,領先優勢可能很快被反超。
作為觀眾,希望能在球賽即將結束時,就提早知道領先是否不可超越。
體育作家Bill James發明瞭一種演算法,用於判斷領先是否“安全”。
演算法描述:
- 獲取領先的分數 ,減去3分
- 如果目前是領先隊控球,則加0.5;否則減0.5(數字小於0則變成0);
- 計算平方後的結果;
- 如果得到的結果比當前比賽剩餘時間的秒數大,則領先是“安全”的。
請編寫程式實現上述演算法的功能,並給出運行結果。
參考答案:
# 方法一:輸入兩隊分數
a = int(input("A隊分數:")) # a隊成績
b = int(input("B隊分數:")) # b隊成績
d = 0
winner = ""
possession = input("球權【a or b】:") # 球權 “a” or "b"
time_remaining = int(input("剩餘時間:")) # 剩餘時間
if a > b:
winner = "a"
c = a - b
if possession == "a":
d = c - 2.5
else:
d = c - 3.5
elif b > a:
winner = "b"
c = b - a
if possession == "b":
d = c - 2.5
else:
d = c - 3.5
else:
d = 0
if d < 0:
d = 0
if d ** 2 > time_remaining:
print("%s隊將獲得最終勝利!" % (winner,))
else:
print("比賽結果不確定。")
# 方法二:輸入領先分數
a = int(input("領先分數:"))
possession = input("領先隊是否控球【y/n】:")
time_remaining = int(input("剩餘時間:"))
if possession == 'y':
b = a + 0.5
else:
b = a - 0.5
if b < 0:
b = 0
score = b ** 2
if score > time_remaining:
print("安全")
else:
print("不安全")
練習題 3
購物組合
小明單位發了100元的購物卡,
小明到超市買三類洗化用品:
洗髮水(15元)、香皂(2元)、牙刷(5元)。要把100元正好花掉,
可有哪些購買組合?
參考答案:
x = range(0, 7)
y = range(0, 51)
z = range(0, 21)
total_list = []
for a in x:
for b in y:
for c in z:
total = 15 * a + 2 * b + 5 * c
if 100 == total:
msg = "洗髮水:{0}瓶;\n香皂:{1}塊;\n牙刷:{2}支;\n".format(a, b, c)
total_list.append(msg)
print("一共有%s種組合。" % (len(total_list),))
for m in total_list:
print(m)
練習題 4
猜數字
首先由電腦產生一個[0,100]之間的隨機整數,然後由用戶猜測所產生的隨機數。
根據用戶猜測的情況給出不同提示:
- 如猜測的數大於產生的數,則顯示“High”,小於則顯示“Low”,等於則顯示“You won !”,游戲結束。
- 用戶最多可以猜7次,如果7次均未猜中,則顯示“You lost!”,並給出正確答案,游戲結束。
- 游戲結束後,詢問用戶是否繼續游戲,選擇“Y”則開始一輪新的猜數游戲;選擇“N”則退出游戲。!
參考答案:
while True:
answer = random.randint(0, 100) # 生成一個0~100的隨機數
for i in range(6, -1, -1): # 迴圈 6,5,4,3,2,1,0
message = "還剩%d次機會" % (i,)
try:
number = int(input("請輸入一個數字:")) # 接受一個用戶輸入的數字
except ValueError:
print("輸入的不是數字,", message)
continue
if num == answer: # 如果大了,提示用戶大了並返回while重新開始
print("恭喜猜中!!!")
break
elif num < answer: # 否則,提示用戶大了並返回while重新開始
print("小了,", message)
else:
print("大了,", message)
if i == 0:
print("很遺憾,您未猜中!!!,答案是:", answer)
ask = input("再來一次?(Y/any):").upper()
if ask == "Y":
continue
else:
break
練習題 5
趕鴨子
一個人趕著鴨子去每個村莊賣,每經過一個村子賣去所趕鴨子的一半又一隻。
這樣他經過了七個村子後還剩兩隻鴨子,問他出發時共趕多少只鴨子?
要求:
- 利用遞歸函數編程實現。
參考答案:
def f(n):
if n == 8:
return 2
else:
sum = f(n+1)*2+2
return sum
print('一共有{}只鴨子'.format(f(1)))
練習題 6
從鍵盤輸入一個1~7的數字,格式化輸出對應數字的星期字元串名稱。
如:輸入3,返回“您輸入的是星期三”。
參考答案:
num = int(input("請輸入1-7:"))
num_list = ["","一", "二", "三", "四", "五", "六", "日"]
print("您輸入的是星期{}".format(num_list[num]))
練習題 7
數字密碼
編程程式,從鍵盤任意輸入1個4位數,
將該數字中的每位數與7相乘,然後取乘積結果的個位數對該數字進行替換,最後得到1個新的4位數。
參考答案:
v = input("請輸入一個四位數:")
v2 = ""
for i in v:
v1 = int(i) * 7
v2 += str(v1 % 10)
print(v2)
練習題 8
九九乘法表
99乘法表
參考答案:
for a in range(1, 10):
for b in range(1, a+1):
print("%s*%s=%s\t" % (b, a, b*a,),end="")
print()
練習題 9
字元查詢
輸入一個字元串 str,輸出第 m 個只出現過 n 次的字元
- 如在字元串 gbgkkdehh 中,找出第 2 個只出現 1 次的字元,輸出結果:d
參考答案:
def find_out(s, n, c):
lis = []
for i in s:
count = content.count(i, 0, len(content))
if count == c:
lis.append(i)
return lis[n - 1]
content = input("請輸入一段字元串:")
num = int(input("第m個字元,m? :"))
counts = int(input("出現過n次,n? :"))
print("第{}個出現過{}次的字元是:".format(num, counts), find_out(content, num, counts))
練習題 10
判斷奇偶數
給定一個數 a,判斷一個數字是奇數或偶數
參考答案:
def odd_or_even(num):
while True:
try:
# 判斷輸入是否為整數
number = int(num)
break
except ValueError:
# 不是純數字需要重新輸入
print("輸入的不是整數!")
continue
if number % 2 == 0:
return '偶數'
else:
return '奇數'
print(odd_or_even(input("請輸入一個數字:")))
練習題 11
字元串去重排列
將字元串 s = “ajldjlajfdljfddd”,去重並從小到大排序輸出”adfjl”。
參考答案:
s = "ajldjlajfdljfddd"
s_set = set() # 集合自帶去重功能,所以只要for迴圈字元串s,並添加到集合中,就可以自動去重。
for i in s:
s_set.add(i)
s_lis = sorted(list(s_set)) # 使用 sorted 方法,對字母進行排序
result = "".join(s_lis) # sorted方法返回的是一個列表,這邊將列表數據轉換成字元串
print(result)
練習題 12
列印菱形
列印如下內容:
*
***
*****
*******
*****
***
*
參考答案:
for i in range(-3,4):
s = 2 * (4 - abs(i)) - 1
print(" " * abs(i), "*" * s)
練習題 13
判斷幾位數和逆序列印
給一個不多於 5 位的正整數(如 a = 12346)
求它是幾位數和逆序列印出各位數字。
參考答案:
def num(n):
print("您輸入的是%s位數。" % (len(n)))
print(n[::-1])
num(input("請輸入一個不多於5位的正整數:"))
練習題 14
水仙花數
如果一個 3 位數等於其各位數字的立方和,則稱這個數為水仙花數。
例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一個水仙花數。
那麼如何求 1000 以內的水仙花數(3 位數)。
參考答案:
for num in range(100, 1000):
hun = num // 100 # 取百位
ten = (num - hun * 100) // 10 #取十位
one = (num - hun * 100 - ten * 10) # 取個位
# hun = int(str(num)[0]) # 取百位,先將數字轉換為字元串,再通過索引取值,再轉換為數字
# ten = int(str(num)[1]) # 取十位,先將數字轉換為字元串,再通過索引取值,再轉換為數字
# one = int(str(num)[2]) # 取個位,先將數字轉換為字元串,再通過索引取值,再轉換為數字
d = hun ** 3 + ten ** 3 + one ** 3
if d == num:
print(str(num),"是水仙花數")
練習題 15
求質數
求10000以內的所有質數
參考答案:
prime_list = [] # 創建一個空列表用於接收發現的質數。
for i in range(2, 10000): # 迴圈2~9999
for a in range(2,i): # 迴圈2~i-1
b = i % a
if b == 0: # 如果i 能被 除1和i本身之外的一個正整數整除,則i不是質數,退出本次for迴圈
break
else: # 這個else是for語句的,如果 整個for迴圈過程,b都不等於0,則執行else,否則不執行
# print("%s是質數。" % (i,))
prime_list.append(i)
print(prime_list) # 列印所有質數列表
print(len(prime_list)) # 列印質數數量
"""
練習題 16
求值
計算 1-2+3-4+5-…-100 的值。
參考答案:
total = 0
for i in range(1,101):
if i % 2 == 0: # i如果是偶數,total = total - i
total -= i
else:
total += i # i如果是奇數,total = total + i
print(total)
練習題 17
立方和
現有計算公式 1^3 + 2^3 + 3^3 + 4^3 + …….+ n^3,
如何實現:當輸入 n = 5 時,輸出 225(對應的公式 : 1^3 + 2^3 + 3^3 + 4^3 + 5^3 = 225)。
參考答案:
n = int(input("輸入一個數字:"))
total = 0
for i in range(1, (n + 1)):
total += i ** 3
print(total)
練習題 18
對稱數組
例如 [1,2,0,2,1],[1,2,3,3,2,1],這樣的數組都是對稱數組。
判斷,是對稱數組列印 True,不是列印 False。
參考答案:
def list_symmetry(l):
if l == l[::-1]:
# reverse 和 [::-1]的區別是,前者改變列表本身,後者不改變列表本身,生成一個反轉後的新列表
return True
else:
return False
print(list_symmetry(['a', 'b', 'd', 'd', 'a']))
print(list_symmetry(['a', 'b', 'c', 'b', 'a']))
練習題 19
取最大值
取出列表 L1 = [1, 2, 3, 11, 2, 5, 3, 2, 5, 33, 88] 中最大的三個值。
參考答案:
l1 = [1, 2, 3, 11, 2, 5, 3, 2, 5, 33, 88]
l1.sort() # 列表從小到大排序
print(l1[-3:]) # 使用切片取列表最後三位
練習題 20
數字組合
有四個數字:1、2、3、4,能組成多少個互不相同且無重覆數字的三位數?各是多少?
參考答案:
# 方法一
l1 = [1, 2, 3, 4]
l2 = []
for x in l1: # 從列表中取值,作為百位數
for y in l1:
if y == x: # 從列表中取值,如果和百位數重覆,重新取值,不重覆,作為十位數。
continue
for z in l1:
if z != x and z != y: # 從列表中取值,如果與百位和十位不重覆,作為個位數。
result = x * 100 + y * 10 + z
l2.append(result)
print(len(l2),"種")
print(l2)
# 方法二 簡便方法:用itertools中的permutations即可。
import itertools # 網上看到的別人的解法,對於itertools不瞭解,粘貼一下,以供參考。
count = 0
l1 = [1, 2, 3, 4]
for i in itertools.permutations(l1, 3):
print(i)
count += 1
print(count)
練習題 21
計算獎金
題目:企業發放的獎金根據利潤提成。
- 利潤(I)低於或等於10萬元時,獎金可提10%;
- 利潤高於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可提成7.5%;
- 20萬到40萬之間時,高於20萬元的部分,可提成5%;
- 40萬到60萬之間時高於40萬元的部分,可提成3%;
- 60萬到100萬之間時,高於60萬元的部分,可提成1.5%,
- 高於100萬元時,超過100萬元的部分按1%提成,
從鍵盤輸入當月利潤I,求應發放獎金總數?
參考答案:
# 我的方法
profit = int(input("利潤金額:"))
if profit <= 100000:
bonus = profit * 0.1
elif 100000 < profit <= 200000:
bonus = 10000 + (profit - 100000) * 0.075
elif 200000 < profit <= 400000:
bonus = 17500 + (profit - 200000) * 0.05
elif 400000 < profit <= 600000:
bonus = 27500 + (profit - 400000) * 0.03
elif 600000 < profit <= 1000000:
bonus = 33500 + (profit - 600000) * 0.015
else:
bonus = 39500 + (profit - 1000000) * 0.01
print("獎金:%s元" % (bonus, ))
# 網上其他人的方法
profit = int(input('利潤金額: '))
bonus = 0
thresholds = [100000, 100000, 200000, 200000, 400000]
rates = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]
for i in range(len(thresholds)):
if profit <= thresholds[i]:
bonus += profit * rates[i]
profit = 0
break
else:
bonus += thresholds[i] * rates[i]
profit -= thresholds[i]
bonus += profit * rates[-1]
print("獎金:%s元" % (bonus, ))
練習題 22
找數字
一個正整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
思路:
- z + 100 = x ** 2
- z + 100 + 168 = y ** 2
x y為兩個相鄰的數時,z為最大值
參考答案:
x = 0
while True:
y = 0
x += 1
while True:
y += 1
if y ** 2 - x ** 2 >= 168:
break
if y ** 2 - x ** 2 == 168 and x ** 2 > 100:
z = x ** 2 - 100
print("這個整數是:{}".format(z, ))
if y - x == 1:
break
練習題 23
查詢第幾天
題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
思路:閏年判斷方法,四年一閏,百年不閏,四百年再閏.
參考答案:
# 例如:2022-9-21
date = input("請輸入日期,格式【XXXX-XX-XX】: ")
date_list = s1.split("-") # 以“-”為分隔符,將字元串分割成列表。
day_list = [31, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 創建一個預設2月份天數的列表
year = int(date_list[0])
if year % 400 == 0 or year % 100 != 0 and year % 4 == 0: # 判斷年份是否為閏年
day_list.insert(1, 29) # 如果是,在列表索引1的位置插入29
else:
day_list.insert(1, 28) # 不是,插入28
days = int(date_list[2])
for d in range(int(date_list[1]) - 1): # 迴圈月數-1,並相加,即,該月份之前的所有天數之和
days += day_list[d] # 再加上當月的天數
print(days)
練習題 24
十秒倒計時
題目:十秒倒計時。
程式分析:使用 time 模塊的 sleep() 函數。
ps:熟悉time模塊
參考答案:
import time
for i in range(10, 0, -1):
print(i)
time.sleep(1)
練習題 25
列印當前時間
題目:持續列印當前時間,一分鐘。
參考答案:
import time
for i in range(60):
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
time.sleep(1)
練習題 26
養兔子
題目:
有一對兔子,從出生後第3個月起每個月都生一對兔子,
小兔子長到第三個月後每個月又生一對兔子,
假如兔子都不死,問每個月的兔子總數為多少?
思路分析:
一月兔 二月兔 成年兔
一月 2 0 0
二月 0 2 0
三月 2 0 2
四月 2 2 2
五月 4 2 4
六月 6 4 6
七月 10 6 10
八月 16 10 16
九月 26 16 26
綜上分析可知,
①二月兔的數量,就是上個月一月兔的數量;
②成年兔的數量,就是上個月成年兔的數量+二月兔的數量;
③一月兔的數量,就是本月成年兔的數量;
參考答案:
month_total = int(input("養殖多少個月:"))
m1 = 2
m2 = 0
m_end = 0
for i in range(month_total):
rabbit_total = m1 + m2 + m_end
print("-" * 20) # 分隔符
print("第%d個月,一共%d只兔子" % (i + 1, rabbit_total))
print("其中一月兔數量:%d只" % (m1,))
print("其中二月兔數量:%d只" % (m2,))
print("其中成年兔數量:%d只" % (m_end,))
m1, m2, m_end = m_end + m2, m1, m_end + m2 # 根據思路分析得出
練習題 27
養兔子——擴展題
上一題擴展,假設兔子壽命只有6個月,
養殖一年,一共還剩多少兔子,一月兔、二月兔、成年兔數量各多少
思路分析:
1. 前6個月數據不變
2. 第七個月開始,成年兔需要減去6個月之前的一月兔數量
3. 一月兔還是等於成年兔數量
4. 二月兔還是等於上個月一月兔數量
需要建立一個列表,記錄每個月一月兔的數量,以便於第七個月開始可以調用
參考答案:
month_total = 12
m1 = 2
m2 = 0
m_end = 0
m1_list = [0, 0, 0, 0, 0]
for i in range(month_total):
rabbit_total = m1 + m2 + m_end
m1_list.append(m1)
print("-" * 20)
print("第%d個月,一共%d只兔子" % (i + 1, rabbit_total))
print("其中一月兔數量:%d只" % (m1,))
print("其中二月兔數量:%d只" % (m2,))
print("其中成年兔數量:%d只" % (m_end,))
m1, m2, m_end = m_end + m2 - m1_list[i], m1, m_end + m2 - m1_list[i]
print("下月死亡成年兔:%d只" % (m1_list[i]))
練習題 28
找出101-200之間的質數
題目:判斷101-200之間有多少個素數,並輸出所有素數。
思路,與練習題15一樣
prime_list = []
for i in range(101, 201):
for a in range(2,i):
b = i % a
if b == 0:
break
else:
print("%s是質數。" % (i,))
prime_list.append(i)
print("101到200之間質數的數量為:", len(prime_list))
練習題 29
猴子分桃子
題目:海灘上有一堆桃子,五隻猴子來分。
第一隻猴子把這堆桃子平均分為五份,多了一個,這隻猴子把多的一個扔入海中,拿走了一份。
第二只猴子把剩下的桃子又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,
第三、第四、第五隻猴子都是這樣做的,
問海灘上原來最少有多少個桃子,最後還剩多少個?
思路分析
a = 5 * b + 1 # 第一隻猴子拿走b個桃子
4 * b = 5 * c + 1 # 第二只猴子拿走c個桃子
4 * c = 5 * d + 1 # 第三隻猴子拿走d個桃子
4 * d = 5 * e + 1 # 第四隻猴子拿走e個桃子
4 * e = 5 * f + 1 # 第五隻猴子拿走f個桃子
參考答案:
# 方法一
f = 0 # 第五隻猴子拿走的桃子數
while True:
f += 1 # 第五隻猴子拿走的桃子數
e = ((5 * f) + 1) / 4 # 第四隻猴子拿走的桃子數
d = ((5 * e) + 1) / 4 # 第三隻猴子拿走的桃子數
c = ((5 * d) + 1) / 4 # 第二只猴子拿走的桃子數
b = ((5 * c) + 1) / 4 # 第一隻猴子拿走的桃子數
a = (5 * b) + 1 # 最開始桃子總數
if e % 1 ==0 and d % 1 ==0 and c % 1 ==0 and b % 1 ==0 and a % 1 ==0: # 桃子數量肯定是整數。
msg = """
一共有{0}個桃子
第一隻猴子拿走{1}個桃子
第二只猴子拿走{2}個桃子
第三隻猴子拿走{3}個桃子
第四隻猴子拿走{4}個桃子
第五隻猴子拿走{5}個桃子
最後還剩{6}個桃子""".format(int(a), int(b), int(c), int(d), int(e), f, 4 * f)
print(msg)
break
# 方法二
x = 0 # 上一隻猴子拿走的桃子數
y = 0 # 最後一隻猴子拿走的桃子數
res = 0 # 桃子總數
b = True
while b:
y += 1 # 第五隻猴子拿走的桃子
x = ((5 * y) + 1) / 4 # 第四隻猴子拿走的桃子
for i in range(3): # 迴圈出前三隻猴子拿走的桃子數,所以是range(3)
if ((5 * x) + 1) % 4 != 0: # ((5 * y) + 1) 需要是4的倍數
break
else:
x = ((5 * x) + 1) / 4
if i == 2: # 如果可以順利完成三次迴圈,桃子總數就是第一隻猴子拿走的桃子數 乘以5,再加上1.
res = (5 * x) + 1
b = False
print("原來最少有%s個桃子,最後還剩%s個桃子。" % (res, 4 * y))
練習題 30
數據加密/解密
題目:某個公司採用公用電話傳遞數據,數據是四位的整數,在傳遞過程中是加密的,加密規則如下:
每位數字都加上5,然後用和除以10的餘數代替該數字,
再將第一位和第四位交換,第二位和第三位交換。
分析:
① 加5,然後用和除以10的餘數,其實就是加5後,新數字的個位數。
② 一四交換,二三交換,其實就是反轉。
參考答案:
# 加密
def encode(content):
res = 0
for i in range(content): # 迴圈四位數(字元串)
n = (int(i) + 5) % 10 # 加5 取餘
res += n * (10 ** i) # 這裡很巧妙將得數直接反轉了,i=0時 content[0]是千位,而10 ** i = 1,得數編程了個位
return res
# 解密
def decode(res):
plain = 0
data = str(res)
for i in range(4):
if int(data[i]) < 5:
n = int(data[i]) + 5
else:
n = int(data[i]) - 5
plain += n * (10 ** i)
return plain