poj3292-Semi-prime H-numbers(筛法打表)

一,题意: 
  一个H-number是所有的模四余一的数。(x=4*k+1) 
  如果一个H-number是H-primes 当且仅当它的因数只有1和它本身(除1外)。
  一个H-number是H-semi-prime当且仅当它只由两个H-primes的乘积表示。
  H-number剩下其他的数均为H-composite。
  给你一个数h,问1到h有多少个H-semi-prime数。
二,思路:
  1,打表;
  2,记数,并储存;
  3,输出;
三,步骤: 
  1,打H-semi-prime表
    i,初始化H_number[]等于零;
    ii,双重循环判断 number[i]和number[j]都等于0时
      (即i和j是H-primes时), H_number[i*j]等于1;
      否则等于-1(即i和j有一个不是H-primes);
  2,记录H-semi-prime的个数,并存入对应的数组元素中;
  3,直接输出 H_number[] 数组元素即可

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int N = 1000010;
 5 int H_number[N];
 6 
 7 void print_H_number(){
 8     memset(H_number, 0, sizeof(H_number)); 
 9     for(int i = 5 ; i < N ; i+=4){
10         for(int j = 5 ; j < N ; j+=4){
11             if(i*j>N)break;                 //防止越界 
12             if(H_number[j]==0&&H_number[i]==0) //表示i和j都是H-primes
13                 H_number[i*j]=1;            //标识 1 表示时是 H-semi-prime
14             else 
15                 H_number[i*j]=-1;    // 表示i和j有一个不是H-primes 所做的标识 
16         }
17     }
18 }
19 
20 void work(){
21     int count=0;
22     for(int i = 1 ; i < N ; i++){
23             if(H_number[i]==1)count++;    //记录 H-prime 的个数 
24             H_number[i]=count;             //将每个范围中的 H-prime 个数存入对应的数组元素中 
25     }
26 }
27 
28 int main(){
29     int n ; 
30     print_H_number();
31     work(); 
32     while(cin>>n,n){
33         cout<<n<<" "<<H_number[n]<<endl;
34     }
35     return 0;
36 }
View Code

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/My-Sunshine/p/4852188.html