题解
【基础】半质数
3 条题解
-
0
#include<bits/stdc++.h> using namespace std; // 创建一个布尔数组,用于标记数字是否为合数(非素数),默认值为false // 数组大小设为5000001,足够覆盖题目中的输入范围 bool signs[5000001]; long long s, e, i, j, c; // s: 范围起点, e: 范围终点, i/j: 循环变量, c: 计数器 int main() { // 读取输入的范围[s, e] cin >> s >> e; // 初始化signs数组,0和1不是素数,标记为true signs[0] = true; signs[1] = true; // 埃拉托斯特尼筛法(筛素数) // 从2开始遍历到e for (i = 2; i <= e; i++) { // 如果i是素数(未被标记) if (signs[i] == false) { // 标记i的所有倍数为合数(非素数) for (j = i * 2; j <= e; j = j + i) { signs[j] = true; } } } // 统计满足条件的素数对(i, j),使得i * j在[s, e]范围内,且i和j都是素数 for (i = 2; i < e; i++) { // 如果i是素数 if (signs[i] == false) { // 遍历j从i开始,确保i * j <= e for (j = i; i * j <= e; j++) { // 如果i * j在[s, e]范围内,且j也是素数 if (i * j >= s && signs[j] == false) { c++; // 计数器加1 } } } } // 输出满足条件的素数对的数量 cout << c; return 0; } -
0
#include<bits/stdc++.h> using namespace std; // 创建一个布尔数组,用于标记数字是否为合数(非素数),默认值为false // 数组大小设为5000001,足够覆盖题目中的输入范围 bool signs[5000001]; long long s, e, i, j, c; // s: 范围起点, e: 范围终点, i/j: 循环变量, c: 计数器 int main() { // 读取输入的范围[s, e] cin >> s >> e; // 初始化signs数组,0和1不是素数,标记为true signs[0] = true; signs[1] = true; // 埃拉托斯特尼筛法(筛素数) // 从2开始遍历到e for (i = 2; i <= e; i++) { // 如果i是素数(未被标记) if (signs[i] == false) { // 标记i的所有倍数为合数(非素数) for (j = i * 2; j <= e; j = j + i) { signs[j] = true; } } } // 统计满足条件的素数对(i, j),使得i * j在[s, e]范围内,且i和j都是素数 for (i = 2; i < e; i++) { // 如果i是素数 if (signs[i] == false) { // 遍历j从i开始,确保i * j <= e for (j = i; i * j <= e; j++) { // 如果i * j在[s, e]范围内,且j也是素数 if (i * j >= s && signs[j] == false) { c++; // 计数器加1 } } } } // 输出满足条件的素数对的数量 cout << c; return 0; } -
0
#include <bits/stdc++.h> using namespace std; bool f[5000005];//标记非素数 int n,m; int main() { //筛选素数,并存入s数组 //枚举:找质数乘质数的个数在n~m范围内 cin>>n>>m; for(int i=2;i<=m;i++){ if(f[i]==0){//质数 for(int j=i+i;j<=m;j+=i){//质数的倍数 f[j]=1;//标记非质数 } } } int c=0; for(int i=2;i<=m;i++){ if(f[i]==0){//质数 for(int j=i;(long long)i*j<=m;j++){//从i~m有可能的质数 if(f[j]==0&&(long long)i*j>=n){//i、j都是质数且在n~m范围内 c++; } } } } cout<<c; return 0; }
- 1