描述
素数或称质数,是指一个大于1的整数,除1和它本身外,不能被其他的正整数所整除。 素数判定方法是: 先用一定的方法枚举正整数n所有可能的真因子,并验证每个枚举的数是否为真因子。若是,则停止枚举,确定n为合数;若枚举完也没发现真因子,可确定n为素数。完成以下函数的定义并按要求完成问题:
定义素数函数is_ prime(n) 将素数的判定代码定义为一个函数,接受用户输入的正整数n,返回n是否是素数,n为素数时返回True,不是素数时返回False。 一个整数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),所以对于每个数n,并不需要从2判断到n-1,只需要遍历到sqrt(n)即可。因为若sqrt(n)左侧找不到因数,那么右侧也一定找不到因数,这样可以显著提升算法的效率。
定义一个函数output_prime(n),接受一个正整数number为参数,在函数中调用问题1中定义的判定素数函数,对不大于number的整数一一判定,在同一行中输出不大于n的全部素数。此函数无返回值,直接输出找到的素数。 调用all_prime(n)函数前,先接收用户输入的一个正整数,作为函数调用时的参数。
3.定义寻找回文素数函数 回文是指数或者字符串具有首尾回环性质,从后向前按位颠倒后与原文一样。首尾回环的数字就是回文数,如:12321;首尾回环的字符串就是回文串,如:'上海自来水来自海上'。 如果一个整数是素数,同时,其对应的字符串是回文字符串时,便称其为回文素数。 编写一个函数,调用前面定义好的素数判定函数和题目给定的回文判定函数完成回文素数的判定,函数无返回值,直接输出找到的回文素数。 输入一个正整数,输出小于这个数的所有回文素数。
寻找反素数 反素数是指一个将其逆向拼写后也是一个素数的非回文数。例如:17和71都是素数且均不是回文数,所以17和71都是反素数。 输入一个正整数n,按从小到大顺序输出所有反素数。
哥德巴赫猜想 1742年,哥德巴赫给欧拉的信中提出了以下猜想“任意一个大于2的整数都可写成三个质数之和”。常见的猜想陈述为欧拉的版本,即任意一个大于2的偶数都可写成两个素数之和,亦称为“强哥德巴赫猜想”或“关于偶数的哥德巴赫猜想”。 编写函数,接收一个大于2的偶数,输出两个素数,并且两个素数之和等于原来的偶数,如果有多个不同组合,则全部输出。若输入的数不是大于2的偶数,输出'Data error!'
输入输出
问题1 如果输入'素数',再输入一个正整数n,按从小到大顺序输出不大于n的所有素数。
问题2 如果输入'回文素数',再输入一个正整数n,按从小到大顺序输出小于n的所有回文素数。
问题3 如果输入'反素数',再输入一个正整数n,输入一个正整数n,按从小到大顺序输出小于n的所有反素数。
问题4 如果输入'哥德巴赫猜想',接收一个大于2的偶数,输出两个素数,并且两个素数之和等于原来的偶数,如果有多个不同组合,则全部输出,格式参考下面的示例。若输入的数不是大于2的偶数,输出'Data error!'
如果输入不是以上字符串,输出'输入错误'。
示例 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
示例2
输入:
回文素数
200
输出:
2 3 5 7 11 101 131 151 181 191
示例3
输入:
反素数
200
输出:
13 17 31 37 71 73 79 97 107 113 149 157 167 179 199
示例4
输入:
哥德巴赫猜想
30
输出:
30=7+23
30=11+19
30=13+17
def question_judge(question):
"""接收一个字符串为参数,根据参数值判断问题类型,调用合适的函数进行操作。"""
if question == '素数': # 如果输入”素数“,再输入一个正整数n,输出不大于n的所有素数
n = int(input())
output_prime(n) # 输出素数
elif question == '回文素数':
n = int(input())
palindromic_prime(n) # 输出回文素数
elif question == '反素数':
n = int(input())
reverse_prime(n) # 输出反素数
elif question == '哥德巴赫猜想':
n = int(input())
goldbach_conjecture(n)
else:
print('输入错误')
def is_prime(n):
"""判断素数的函数,接收一个正整数为参数,参数是素数时返回True,否则返回False
减小判定区间,减少循环次数,提升效率"""
if n < 2:
return False
for i in range(2,int(n**0.5+1)):
if n % i == 0:
return False
else:
return True
def output_prime(number):
"""接收一个正整数为参数,遍历从0到number之间的所有整数
在一行中输出不大于number的所有素数,函数无返回值"""
for i in range(number+1):
if is_prime(i)==True:
print(i,end=' ')
def palindromic(num):
"""接收一个数字为参数,判定其是否为回文数,返回布尔值。"""
return str(num) == str(num)[::-1]
def palindromic_prime(number):
"""接收一个正整数参数number,遍历从0到number之间的所有整数,
若某个数是素数,且转为字符串后是回文字符串,则称其为回文素数
找出并在同一行中从小到大输出小于number的所有回文素数,各数字间用一个空格分隔,
函数无返回值"""
for i in range(number+1):
if palindromic(i)==True and is_prime(i)==True:
print(i,end=' ')
def reverse_num(num):
"""接收一个整数,返回其逆序字符串对应的整数"""
return int(str(num)[::-1])
def reverse_prime(number):
"""接收一个正整数参数,找出并在同一行内输出所有小于number的反素数,数字间用一个空格分隔。
反素数指某数i及其逆序数都是素数,但数i对应的字符串不是回文字符串
函数无返回值"""
for i in range(number):
if palindromic(i)==False and is_prime(i)==True and is_prime(reverse_num(i))==True :
print(i,end=' ')
def goldbach_conjecture(num):
""" 哥德巴赫猜想, 接收一个不小于4的正整数为参数。
当参数为不小于4的偶数时,将其分解为两个素数的加和,按小数+数的格式输出。
有多种组合时全部输出,但不输出重复的组合,例如输出8=3+5,不输出8=5+3。
参数为奇数或小于4时,输出'Data error!'
"""
if num %2==0 and num>=4:
for i in range(2,(num//2)+1):
if is_prime(i)==True and is_prime(num-i)==True:
print(f"{num}={i}+{num-i}")
else:
print("Data error!")
if __name__ == '__main__':
problems = input()
question_judge(problems)
测试: