注意素数对
(
a
,
b
)
(a,b)
(a,b) 和
(
b
,
a
)
(b,a)
(b,a) 算作同一对
代码
#include<iostream>#include<vector>usingnamespace std;// 判断是否为素数boolisPrime(int n){if(n <2)returnfalse;for(int i =2; i * i <= n; i++){if(n % i ==0)returnfalse;}returntrue;}intmain(){int n;
cin >> n;// 生成素数列表
vector<int> primes;for(int i =2; i <= n; i++){if(isPrime(i)){
primes.push_back(i);}}// 统计素数对数量int count =0;for(int i =0; i < primes.size(); i++){for(int j = i; j < primes.size(); j++){if(primes[i]+ primes[j]== n){
count++;}}}
cout << count << endl;return0;}
importjava.util.*;publicclassMain{// 判断是否为素数privatestaticbooleanisPrime(int n){if(n <2)returnfalse;for(int i =2; i * i <= n; i++){if(n % i ==0)returnfalse;}returntrue;}publicstaticvoidmain(String[] args){Scanner sc =newScanner(System.in);int n = sc.nextInt();// 生成素数列表List<Integer> primes =newArrayList<>();for(int i =2; i <= n; i++){if(isPrime(i)){
primes.add(i);}}// 统计素数对数量int count =0;for(int i =0; i < primes.size(); i++){for(int j = i; j < primes.size(); j++){if(primes.get(i)+ primes.get(j)== n){
count++;}}}System.out.println(count);}}
defis_prime(n):if n <2:returnFalsefor i inrange(2,int(n **0.5)+1):if n % i ==0:returnFalsereturnTruedefsolve():
n =int(input())# 生成素数列表
primes =[i for i inrange(2, n+1)if is_prime(i)]# 统计素数对数量
count =0for i inrange(len(primes)):for j inrange(i,len(primes)):if primes[i]+ primes[j]== n:
count +=1print(count)if __name__ =="__main__":
solve()
算法及复杂度
算法:素数筛选 + 双重循环
时间复杂度:
O
(
n
n
)
\mathcal{O}(n\sqrt{n})
O(nn),其中素数判断为
O
(
n
)
\mathcal{O}(\sqrt{n})
O(n),需要判断
n
n
n个数