循环加强
练习题
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不是闰年