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

时间:2022-05-30 15:52:04

一,题意: 
  一个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[] 数组元素即可

 #include<iostream>
#include<cstring>
using namespace std;
const int N = ;
int H_number[N]; void print_H_number(){
memset(H_number, , sizeof(H_number));
for(int i = ; i < N ; i+=){
for(int j = ; j < N ; j+=){
if(i*j>N)break; //防止越界
if(H_number[j]==&&H_number[i]==) //表示i和j都是H-primes
H_number[i*j]=; //标识 1 表示时是 H-semi-prime
else
H_number[i*j]=-; // 表示i和j有一个不是H-primes 所做的标识
}
}
} void work(){
int count=;
for(int i = ; i < N ; i++){
if(H_number[i]==)count++; //记录 H-prime 的个数
H_number[i]=count; //将每个范围中的 H-prime 个数存入对应的数组元素中
}
} int main(){
int n ;
print_H_number();
work();
while(cin>>n,n){
cout<<n<<" "<<H_number[n]<<endl;
}
return ;
}

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