检查整数是否可以表示为Python中两个半素数的和
假设我们有一个数字n,我们必须检查n是否可以表示为两个半素数之和。
如我们所知,半素数可以表示为两个素数的乘积。前几个半素数是(1-100范围):4、6、9、10、14、15、21、22、25、26、33、34、35、38、39、46、49、51,55、57、58、62、65、69、74、77、82、85、86、87、91、93、94、95。
因此,如果输入像n=108,则输出将为True,因为这是14和94的和都是半素数。
为了解决这个问题,我们将遵循以下步骤-
MAX:=10000假定给定输入是范围在1到10000之间的半素数之和
nums:=一个新列表
s_prime_flags:=大小为MAX的数组,并用False填充
定义功能get_semi_primes()。这将需要
对于2到MAX-1范围内的i
s_prime_flags[i]:=真
数:=数+1
虽然num可被j整除,但是
j:=j+1
num:=num/j
数:=数+1
计数:=0
num:=我
j:=2
当count<2并且j^2<=num时
如果num>1,则
如果计数等于2,则
在数字的末尾插入i
从主要方法中执行以下操作-
呼叫get_semi_primes()
i:=0
而nums[i]<=(n/2)的商,
返回True
如果s_prime_flags[n-nums[i]]为True,则
我:=我+1
返回False
让我们看下面的实现以更好地理解-
示例
MAX = 10000
nums = []
s_prime_flags = [False] * MAX
def get_semi_primes():
for i in range(2, MAX):
count = 0
num = i
j = 2
while count < 2 and j * j <= num:
while num % j == 0:
num /= j
count += 1
j += 1
if num > 1:
count += 1
if count == 2:
s_prime_flags[i] = True
nums.append(i)def solve(n):
get_semi_primes() i = 0
while nums[i] <= n //2:
if s_prime_flags[n - nums[i]] == True:
return True
i += 1
return False
n = 108
print(solve(n))输入值
[4, 2, 3], 11输出结果
True