top1编程
← 返回题目
题解

【基础】半质数

3 条题解

  • 0
    @ 2026-7-29 20:23:57
    #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
      @ 2026-7-29 0:06:26
      #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
        @ 2026-7-28 23:04:13
        #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