• 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

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

  • 相关阅读:
    浅谈servlet源码
    移动端测试的8大过程
    Pc端微信加群和app端加群测试用例设计点
    视频播放的用例设计点
    发红包的测试用例设计点
    朋友圈点赞用例设计点
    ADB
    语音 小说 逻辑
    nginx
    Jenkins—安装与简单使用
  • 原文地址:https://www.cnblogs.com/My-Sunshine/p/4852188.html
Copyright © 2020-2023  润新知