第二题(难度系数 2,满分 50 分)
编程实现:打印出 1~1000 之间包含 3 的数字;如果 3 是连在一起的(如 233)则在数字前加上&;如果这个数字是质数则在数字后加上*,例:(3,13*,23*,&33,43*…&233*…)。
输入:无
输出:按照题意输出的数字,每行一个数字
样例输出:3
13*
23*
&33
……
将程序命名为“lq002”。
评判标准:
10 分:完成打印 1~1000 之间包含 3 的数字
30 分:在 10 分标准的基础上,找出其中的连 3,前面加&
50 分:在 30 分标准的基础上,找出其中的质数,后面加*
这道题的任务有:①完成打印 1~1000 之间包含 3 的数字;②找出其中的连 3,前面加&;③找出其中的质数,后面加*。
如何输出1~1000之间包含3的数字呢?这里我们需要用到for循环,并在for循环(取头不取尾)中判断是否含有文字“3”(接下来使用in成员运算符,必须转换)。代码如下:
for i in range(1,1000 + 1): #循环遍历1~1000中的数字
if "3" in str(i): #判断文字“3”是否在该数字中出现
print(str(i)) #输出该数字
接下来就要找连3了。以下为连3的数字例子:
两位数 | 三位数 | 四位数 | … |
33 | 133 | 1333 | |
333 | 2033 | ||
533 | 3333 | ||
… | … |
在1~1000中,只会有最多三位的连3,但是三位的连3内含有两位的连3,所以我们只需要判断数字中是否含有两位的连3即可。
for i in range(1,1000 + 1): #循环遍历1~1000中的数字
if "3" in str(i): #判断文字“3”是否在该数字中
if "33" in str(i): #判断该数字中是否有连3
print("&" + str(i)) #输出&+数字
else: #否则
print(str(i)) #输出该数字
最后一步,判断遍历到的数字是否是质数。我们可以定义一个函数来判断质数(需提前导入math模块,我们需要用到开方函数sqrt)。
质数的特点是:①大于1;②除了除以本身和1以外不能除以其他数字。代码如下:
import math #导入math数学模块
def isPrime(n): #定义函数
if n <= 1: #判断数字是否小于等于1
return False #不成立
for i in range(2,int(math.sqrt(n)) + 1): #遍历2~该数字
if n % i == 0: #判断质数
return False #不成立
return True #成立
调用函数体:
for i in range(1,1000 + 1): #循环遍历1~1000中的数字
if "3" in str(i): #判断文字“3”是否在该数字中
if "33" in str(i): #判断该数字中是否有连3
print("&" + str(i)) #输出&+数字
elif isPrime(i): #判断质数
print(str(i) + "*") #输出数字+*
else: #否则
print(str(i)) #输出该数字
else:
continue #如果这个数字不含3,则进入下次循环
题目已讲解完毕,以下为所有代码:
import math #导入math数学模块
def isPrime(n): #定义函数
if n <= 1: #判断数字是否小于等于1
return False #不成立
for i in range(2,int(math.sqrt(n)) + 1): #遍历2~该数字
if n % i == 0: #判断质数
return False #不成立
return True #成立
for i in range(1,1000 + 1): #循环遍历1~1000中的数字
if "3" in str(i): #判断文字“3”是否在该数字中
if "33" in str(i): #判断该数字中是否有连3
print("&" + str(i)) #输出&+数字
elif isPrime(i): #判断质数
print(str(i) + "*") #输出数字+*
else: #否则
print(str(i)) #输出该数字
else:
continue #如果这个数字不含3,则进入下次循环