循環加強
練習題
1、求一個數是否是質數(素數)?
友情提示:質數是隻能被1和自身整除的數字
2、求50~150之間的質數是那些?
3、圖案的打印
4、完整計算器程序
用戶輸入第一個數據
用戶輸入操作符號
用戶輸入第二個數據
運算展示結果
擴展:eval()函數的使用
5、一個自然數與3的和是5的倍數,與3的差是6的倍數,這個自然數最小是幾?
6、在400–500之間求一個數,它被2除餘1,被5除餘3,被9除餘1,這個數是多少?
7、有一些四位數,百位數字都是3,十位數字都是6,並且它們既能被2整除,又能被3整除,求這樣的四位數中最大的和最小的兩數各是幾?
8、打印輸出標準水仙花數,輸出這些水仙花數
9.編程求一個四位自然數ABCD,它乘以A後變成DCBA
10.編程求出滿足以下條件的三位數:它除以11所得的商等於
它各位數字之和.
11.某數被80除所得的商,不但是7的倍數,而且用2,3,4,5,6去
除餘數都是1,求這 個自然數.
12.有一種最簡真分數,它們的分子與分母的乘積都是140,把
所有這樣的真分數從小到大打印出來
13.一個五位數,若在它的後面寫上一個7,得到一個六位數A,
若在它前面寫上一個7,得到一個六位數B,B是A的五倍,求此
五位數.
14.把123456789這個數乘以一個什麼數,能使它的結果不但
不含零,而且仍然是 由1,2,3,4,5,6,7,8,9這九個數字組成的,
只是順序不同而已.
15.驗證:任意一個大於9的整數減去它的各位數字之和所得
的差,一定能被9整除.
16.今有四個人,他們得年齡各不相同,他們年齡總和是129,
而其中有三個人的年齡是平方數,若倒退15年,這四人中仍
有三個人的年齡是平方數,求他們各自的年齡
17.如果兩個素數之差爲2,這樣的兩個素數就叫作"孿生數",
找出100以內的所有"孿生數".
18、判斷某一年是否是閏年
解題
1、求一個數是否是質數(素數)?
友情提示:質數是隻能被1和自身整除的數字
import sys
while True:
print("1.進入系統 2.退出系統")
choice = int(input("請做出選擇:"))
if choice == 1:
num = int(input("請輸入一個數字:"))
#定義一個布爾值,flag爲真代表是素數
flag = True
#range(2,num)表示了1-num之間的數字,用num整除這之間的數字,若爲0了,則不是素數,反之亦然
for i in range(2,num):
if num%i == 0:
#被整除了,所以不是質數,將flag設置爲Flase
flag = False
#判斷出來後,不需要再循環了,所以直接跳出即可
break
if flag:
print("{}是素數".format(num))
else:
print("%s不是素數" %(num))
elif choice == 2:
sys.exit()
else:
input("您的輸入有誤,請重新輸入~ 按任意鍵繼續")
#執行代碼
D:\網絡安全\Python\py_code>python h2-判斷素數.py
1.進入系統 2.退出系統
請做出選擇:3
您的輸入有誤,請重新輸入~ 按任意鍵繼續
1.進入系統 2.退出系統
請做出選擇:1
請輸入一個數字:67
67是素數
1.進入系統 2.退出系統
請做出選擇:1
請輸入一個數字:4
4不是素數
1.進入系統 2.退出系統
請做出選擇:2
2、求50~150之間的質數是那些?
import sys
while True:
print("1.進入系統 2.退出系統")
choice = int(input("請做出選擇:"))
if choice == 1:
#使用range()函數來實現可迭代對象
for num in range(50,151):
#定義一個布爾值,flag爲真代表是素數
flag = True
#range(2,num)表示了1-num之間的數字,用num整除這之間的數字,若爲0了,則不是素數,反之亦然
for i in range(2,num):
if num%i == 0:
#被整除了,所以不是質數,將flag設置爲Flase
flag = False
#判斷出來後,不需要再循環了,所以直接跳出即可
break
if flag:
print("{}是素數".format(num))
else:
#由於題目是隻打印素數,所以else語句不做任何輸出內容
pass
elif choice == 2:
sys.exit()
else:
input("您的輸入有誤,請重新輸入~ 按任意鍵繼續")
#執行代碼
D:\網絡安全\Python\py_code>python h2-判斷素數.py
1.進入系統 2.退出系統
請做出選擇:1
53是素數
59是素數
61是素數
67是素數
71是素數
73是素數
79是素數
83是素數
89是素數
97是素數
101是素數
103是素數
107是素數
109是素數
113是素數
127是素數
131是素數
137是素數
139是素數
149是素數
1.進入系統 2.退出系統
3、使用循環完成如下圖案的打印
*
**
***
****
*****
分析:
每行打印的內容就是行數
layer = int(input("請輸入需要打印的行數:"))
#外層循環控制行數,4行;使用range()函數來進行迭代,1-5
for i in range(1,layer+1):
#內層循環打印每行要顯示的內容
for j in range(1,i+1):
print("*",end="")
print()
#執行代碼
D:\網絡安全\Python\py_code>python test.py
請輸入需要打印的行數:5
*
**
***
****
*****
*
***
*****
*******
分析:
行數 空格數 *
1 3 1
2 2 3
3 1 5
4 0 7
可以看出每行打印的空格數位爲 總的行數減去當前行數
每行打印的*的個數位 當前行數乘2減1
layer = int(input("請輸入需要打印的行數:"))
#外層循環控制行數;使用range()函數來進行迭代
for i in range(1,layer+1):
#定義打印的空格與*的數量
space = layer-i
start = 2*i-1
#內層循環打印每行要顯示的內容
#先打印空格
for j in range(space):
print(" ",end="")
#打印*
for k in range(start):
print("*",end="")
#每行打印完成後需要換行
print()
#執行代碼
D:\網絡安全\Python\py_code>python test.py
請輸入需要打印的行數:5
*
***
*****
*******
*********
*
* *
* *
* *
*********
分析:
這個圖案與上一個圖案的區別在於中間打印*的空心結構,解決辦法爲在打印*時,做出判斷
layer = int(input("請輸入需要打印的行數:"))
#外層循環控制行數;使用range()函數來進行迭代
for i in range(1,layer+1):
#定義打印的空格與*的數量
space = layer-i
start = 2*i-1
#內層循環打印每行要顯示的內容
#先打印空格
for j in range(space):
print(" ",end="")
#打印*
for k in range(start):
#判斷空心結構的空格何時打印,
if k == 0 or k == start-1 or i==layer:
print("*",end="")
else:
print(" ",end="")
#每行打印完成後需要換行
print()
#執行代碼
D:\網絡安全\Python\py_code>python test.py
請輸入需要打印的行數:5
*
* *
* *
* *
*********
*
***
*****
*******
*****
***
*
分析:
這種對稱結構,肯定是奇數行,可以分成上下兩個部分來對圖形進行打印,其餘與第二個圖案的打印方式相同
layer = int(input("請輸入需要打印的行數:"))
#校驗層數必須是奇數行,行數不能小於2
while layer%2 ==0 or layer < 2:
layer = int(input("對不起,輸入有誤,請重新輸入,按任意鍵繼續~"))
"""上半部分"""
#外層循環控制行數;使用range()函數來進行迭代;分爲上半部分與下半部分;
#把長的部分打印到上半部分爲layer//2+1,又因爲range()函數的迭代特性,再加上一個1
for i in range(1,layer//2+2):
#定義打印的空格與*的數量
space = layer-i
start = 2*i-1
#內層循環打印每行要顯示的內容
#先打印空格
for j in range(space):
print(" ",end="")
#打印*
for k in range(start):
print("*",end="")
#每行打印完成後需要換行
print()
"""下半部分"""
#從整除2的部分開始打印,即短的那部分開始,步長爲-1,即每行每次縮短
for i in range(layer//2,0,-1):
#定義打印的空格與*的數量
space = layer-i
start = 2*i-1
#內層循環打印每行要顯示的內容
#先打印空格
for j in range(space):
print(" ",end="")
#打印*
for k in range(start):
print("*",end="")
#每行打印完成後需要換行
print()
#執行代碼
D:\網絡安全\Python\py_code>python test.py
請輸入需要打印的行數:9
*
***
*****
*******
*********
*******
*****
***
*
*
* *
* *
* *
* *
* *
*
分析:
參考第三個圖案的打印,注意上半部分的空格打印條件
layer = int(input("請輸入需要打印的行數:"))
#校驗層數必須是奇數行,行數不能小於2
while layer%2 ==0 or layer < 2:
layer = int(input("對不起,輸入有誤,請重新輸入,按任意鍵繼續~"))
"""上半部分"""
#外層循環控制行數;使用range()函數來進行迭代;分爲上半部分與下半部分;
#把長的部分打印到上半部分爲layer//2+1,又因爲range()函數的迭代特性,再加上一個1
for i in range(1,layer//2+2):
#定義打印的空格與*的數量
space = layer-i
start = 2*i-1
#內層循環打印每行要顯示的內容
#先打印空格
for j in range(space):
print(" ",end="")
#打印*
for k in range(start):
"""注意這裏爲什麼要加2,因爲上半部分打印的是長的,即多出來一行"""
if k == 0 or k == start-1 or i==layer//2+2:
print("*",end="")
else:
print(" ",end="")
#每行打印完成後需要換行
print()
"""下半部分"""
#從整除2的部分開始打印,即短的那部分開始,步長爲-1,即每行每次縮短
for i in range(layer//2,0,-1):
#定義打印的空格與*的數量
space = layer-i
start = 2*i-1
#內層循環打印每行要顯示的內容
#先打印空格
for j in range(space):
print(" ",end="")
#打印*
for k in range(start):
"""注意這裏是下半部分的打印;注意分析條件"""
if k == 0 or k == start-1:
print("*",end="")
else:
print(" ",end="")
#每行打印完成後需要換行
print()
#執行代碼
D:\網絡安全\Python\py_code>python test.py
請輸入需要打印的行數:9
*
* *
* *
* *
* *
* *
* *
* *
*
*
***
* * *
*******
* * *
***
*
4、完整計算器程序
用戶輸入第一個數據
用戶輸入操作符號
用戶輸入第二個數據
運算展示結果
擴展:eval()函數的使用
import sys
while True:
print("1.運行系統 2.退出系統")
choice = int(input())
if choice == 1:
#用戶的輸入
num1,num2 = eval(input("請輸入兩個操作數:"))
operator = input("請輸入操作符:")
if operator == "+":
print("{}+{}={}".format(num1,num2,num1+num2))
elif operator == "-":
print("{}-{}={}".format(num1,num2,num1-num2))
elif operator == "*":
print("{}*{}={}".format(num1,num2,num1*num2))
elif operator == "/":
print("{}/{}={}".format(num1,num2,num1/num2))
else:
input("您的輸入有誤,請重新輸入~ 按任意鍵繼續")
elif choice == 2:
sys.exit()
else:
input("您的輸入有誤,請重新輸入~ 按任意鍵繼續")
#執行代碼
D:\網絡安全\Python\py_code>python h2-eval()函數的使用.py
1.運行系統 2.退出系統
1
請輸入兩個操作數:1,3
請輸入操作符:-
1-3=-2
1.運行系統 2.退出系統
3
您的輸入有誤,請重新輸入~ 按任意鍵繼續
1.運行系統 2.退出系統
2
D:\網絡安全\Python\py_code>python h2-eval()函數的使用.py
1.運行系統 2.退出系統
3
您的輸入有誤,請重新輸入~ 按任意鍵繼續
1.運行系統 2.退出系統
1
請輸入兩個操作數:1,3
請輸入操作符:+
1+3=4
1.運行系統 2.退出系統
1
請輸入兩個操作數:1,5
請輸入操作符:-
1-5=-4
1.運行系統 2.退出系統
1
請輸入兩個操作數:2,3
請輸入操作符:*
2*3=6
1.運行系統 2.退出系統
1
請輸入兩個操作數:6,3
請輸入操作符:/
6/3=2.0
1.運行系統 2.退出系統
2
5、一個自然數與3的和是5的倍數,與3的差是6的倍數,這個自然數最小是幾?
for num in range(1000):
if ((num+3)%5==0) and ((num-3)%6==0):
break
else:
continue
print(num)
#執行代碼
D:\網絡安全\Python\py_code>python "h2-最小的自然數(與3的和是5的倍數,與3的差是6的倍數).py"
27
6、在400–500之間求一個數,它被2除餘1,被5除餘3,被9除餘1,這個數是多少?
#range()函數來迭代400-500
for i in range(400,501):
if ((i%2)==1) and ((i%5)==3) and ((i%9)==1):
print(i)
#代碼執行
D:\網絡安全\Python\py_code>python h3-第六題.py
433
7、有一些四位數,百位數字都是3,十位數字都是6,並且它們既能被2整除,又能被3整除,求這樣的四位數中最大的和最小的兩數各是幾?
for i in range(9999,1001,-1):
gewei = (i%1000)%100%10
shiwei = 6
baiwei = 3
qianwei = i//1000
change = gewei+shiwei*10+baiwei*100+qianwei*1000
if ((change%2) == 0 and (change%3) == 0):
break
print(change)
for i in range(1000,10000):
gewei = (i%1000)%100%10
shiwei = 6
baiwei = 3
qianwei = i//1000
change = gewei+shiwei*10+baiwei*100+qianwei*1000
if ((change%2) == 0 and (change%3) == 0):
break
print(change)
#執行代碼
D:\網絡安全\Python\py_code>python de.py
9366
1362
8、打印輸出標準水仙花數,輸出這些水仙花數
分析:所謂的“水仙花數”是指一個三位數其各位數字的立方和等於該數本身,例如153是“水仙花數”,因爲:153 = 1^3 + 5^3 + 3^3
for i in range(100,1000):
gewei = (i%100)%10
shiwei = (i%100)//10
baiwei = i//100
if (gewei**3)+(shiwei**3)+(baiwei**3) == i:
print(i)
#執行代碼
D:\網絡安全\Python\py_code>python de.py
153
370
371
407
9.編程求一個四位自然數ABCD,它乘以A後變成DCBA
#使用range()函數來確定四位數的迭代對象
for i in range(1000,10000):
gewei = (i%1000)%100%10
shiwei = (i%1000)%100//10
baiwei = (i%1000)//100
qianwei = i//1000
#DCBA的計算方式
change = gewei*1000+shiwei*100+baiwei*10+qianwei
if (i*qianwei) == change:
print(i,end="\t")
#執行代碼
D:\網絡安全\Python\py_code>python test.py
1001 1111 1221 1331 1441 1551 1661 1771 1881 1991
10.編程求出滿足以下條件的三位數:它除以11所得的商等於它各位數字之和.
#使用range()函數來確定三位數的迭代對象
for i in range(100,1000):
baiwei = i//100
gewei = (i%100)%10
shiwei = (i%100)//10
if (i//11) ==(gewei+shiwei+baiwei):
print(i)
#執行代碼
D:\網絡安全\Python\py_code>python test.py
108 118 128 138 148 158 168 178 188 197 198
11.某數被80除所得的商,不但是7的倍數,而且用2,3,4,5,6去除餘數都是1,求這個自然數.
分析:某數整除80所得 可以%7 爲0;某數%2,3,4,5,6爲1
flag = 0
for i in range(1,1000):
shang = 80//i
yushu = i%80
a = i%2
b = i%3
c = i%4
d = i%5
e = i%6
if shang%7==0 and a==1 and b==1 and c==1 and d==1 and e==1:
flag += 1
print(i,end="\t")
#flag爲5或10時,換行,用於輸出結果易觀察
if flag == 5 or flag == 10:
print()
#執行代碼
D:\網絡安全\Python\py_code>python de.py
121 181 241 301 361
421 481 541 601 661
721 781 841 901 961
12.有一種最簡真分數,它們的分子與分母的乘積都是140,把所有這樣的真分數從小到大打印出來
#首先要確認分子分母的大小範圍,當然爲了,省事,可以寫大點,但是爲了降低代碼的時間、空間複雜度,建議先分析
for i in range(1,11):
for j in range(i+1,141):
if i*j == 140:
print("{}/{}".format(i,j))
#執行代碼
D:\網絡安全\Python\py_code>python test.py
1/140
2/70
4/35
5/28
7/20
10/14
13.一個五位數,若在它的後面寫上一個7,得到一個六位數A,若在它前面寫上一個7,得到一個六位數B,B是A的五倍,求此五位數.
#使用range()函數來確定五位數的迭代對象
for i in range(10000,100000):
gewei = (i%10000)%1000%100%10
shiwei = (i%10000)%1000%100//10
baiwei = (i%10000)%1000//100
qianwei = (i%10000)//1000
wanwei = i//10000
#A、B的計算方式
a = 7+gewei*10+shiwei*100+baiwei*1000+qianwei*10000+wanwei*100000
b = gewei+shiwei*10+baiwei*100+qianwei*1000+wanwei*10000+7*100000
if b == a*5:
print(i)
#執行代碼
D:\網絡安全\Python\py_code>python test.py
14285
14.把123456789這個數乘以一個什麼數,能使它的結果不但不含零,而且仍然是 由1,2,3,4,5,6,7,8,9這九個數字組成的,只是順序不同而已.
15.驗證:任意一個大於9的整數減去它的各位數字之和所得的差,一定能被9整除.
思路如下,也可通過循環來完善,即自動化判斷輸入的位數
"""
驗證:任意一個大於9的整數減去它的各位數字之和所得
的差,一定能被9整除.
"""
num = int(input("請輸入一個大於9的整數:"))
# (12 - (1 + 2)) / 9
# 假如就是兩位
if num < 100:
gewei = num % 10
shiwei = num // 10
if (num - (gewei + shiwei)) % 9 == 0:
print("驗證通過")
else:
print("驗證失敗")
elif num > 99 and num < 1000:
# 三位數的
gewei = (num%100)%10
shiwei = (num%100)//10
bawei = num//100
if (num - (gewei + shiwei + bawei)) % 9 == 0:
print("驗證通過")
else:
print("驗證失敗")
else:
pass
#代碼執行
D:\網絡安全\Python\py_code>python test.py
請輸入一個大於9的整數:13
驗證通過
D:\網絡安全\Python\py_code>python test.py
請輸入一個大於9的整數:123
驗證通過
16.今有四個人,他們得年齡各不相同,他們年齡總和是129,而其中有三個人的年齡是平方數,若倒退15年,這四人中仍有三個人的年齡是平方數,求他們各自的年齡
17.如果兩個素數之差爲2,這樣的兩個素數就叫作"孿生數",找出100以內的所有"孿生數".
分析:
需先判斷出100以內的素數,然後將這些素數存儲在某一種數據結構中,我採用的是列表,循環的方式判斷”孿生數“
ls = []
#外層循環用於迭代0-100的數字,1不做判斷
for num in range(2,101):
#定義一個布爾值,flag爲真代表是素數
flag = True
#內層循環用於判斷
for i in range(2,num):
if num%i == 0:
#被整除了,所以不是質數,將flag設置爲Flase
flag = False
#判斷出來後,不需要再循環了,所以直接跳出即可
break
if flag:
#將所有的素數存儲在容器中,這裏的容器選擇列表,因爲可以通過下標來進行訪問
ls.append(num)
else:
#由於題目是隻打印素數,所以else語句不做任何輸出內容
pass
print("1~100以內的素數有:")
print(ls)
# 找出100內的孿生數
index = 1
while index < len(ls):
#爲防止下標越界,採用如下方式
if ls[index] - ls[index - 1] == 2:
print("{}和{}是孿生數".format(ls[index], ls[index - 1]))
index += 1
#執行代碼
D:\網絡安全\Python\py_code>python test.py
1~100以內的素數有:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
5和3是孿生數
7和5是孿生數
13和11是孿生數
19和17是孿生數
31和29是孿生數
43和41是孿生數
61和59是孿生數
73和71是孿生數
18、判斷某一年是否是閏年
分析:
(1)能被4整除但不能被100整除;
(2)能被400整除;
year = int(input("請輸入一個年份:"))
if (year%4==0 and year%100!=0) or year%400 == 0:
print("%s是閏年"%year)
else:
print("{}不是閏年".format(year))
#執行代碼
D:\網絡安全\Python\py_code>python test.py
請輸入一個年份:2000
2000是閏年
D:\網絡安全\Python\py_code>python test.py
請輸入一個年份:1990
1990不是閏年