加强一下质数学习,用线性筛选法降低时间复杂度,提高效率
1.纯质数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 20210605; // 质数生成范围
int primes[N], cnt; // primes[]存储所有的质数,cnt质数数量
bool st[N]; // st[x]表示 x 是否被标记(存储的是非质数)
// 线性筛法生成质数(直接用模板)
void get_primes(int n)
{
for (int i = 2; i <= n; i++)
{
if (!st[i]) primes[cnt++] = i;
for (int j = 0; primes[j] <= n / i; j++)
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
// 检查一个数是否是质数
bool is_prime(int x)
{
if (x < 2) return false;
if (x < N) return !st[x];
return false;
}
//数位拆分
int fun(int y)
{
int sign=0;
while(y)
{
sign=y%10;
y/=10;
if(!is_prime(sign))
{
return 0;
}
}
return 1;
}
int main()
{
int sum=0;
get_primes(20210605);
for(int i=0; i<cnt; i++)
{
sum+=fun(primes[i]);
}
cout<<sum<<endl;
return 0;
}
2.哥德巴赫猜想
题目链接:E-哥德巴赫猜想_河南萌新联赛2024第(五)场:信息工程大学 (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 50010; // 质数生成范围
int t;
int primes[N], cnt; // primes[]存储所有的质数
bool st[N]; // st[x]表示 x 是否被标记(存储的是非质数)
// 线性筛法生成质数(直接用模板)
void get_primes(int n)
{
for (int i = 2; i <= n; i++)
{
if (!st[i]) primes[cnt++] = i;
for (int j = 0; primes[j] <= n / i; j++)
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
// 检查一个数是否是质数
bool is_prime(int x)
{
if (x < 2) return false;
if (x < N) return !st[x];
return false;
}
int main()
{
get_primes(50000);
cin >> t;
while (t--)
{
int n;
cin >> n;
bool found = false;
for (int i = 0; i < cnt; i++)
{
for (int j = i; j < cnt; j++)
{
int temp = n - primes[i] - primes[j];
if (temp > 0 && is_prime(temp) && temp >= primes[j])
{
cout << primes[i] << " " << primes[j] << " " << temp << endl;
found = true;
break;
}
}
if (found)
{
break;
}
}
if (!found)
{
cout << -1 << endl;
}
}
return 0;
}