Python第三天巩固练习题(循环加强)

循环加强

练习题

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
可以看出每行打印的空格数位为 总的行数减去当前行数
每行打印的*的个数位 当前行数乘21

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]
53是孪生数
75是孪生数
1311是孪生数
1917是孪生数
3129是孪生数
4341是孪生数
6159是孪生数
7371是孪生数

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不是闰年

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值