poj3282

定义一个有4x+1组成的无限集合x>0&x∈Z

素数   x 不能有x = y*z,y,z都是素数

合数 x 有x = y*z y|z中某个数是素数

simi数,只能由两个素数构成。

打表

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int maxa =1000005;
int a[maxa];   //prime 0, composites 1;
int b[maxa];   //simi
int ans[maxa];
int main(){
    for(int i = 1; 4*i+1 < maxa; i++){
        if(a[4*i+1] == 0){//printf("%d ",4*i+1);
            for(int k = 1; (k*4+1)*(i*4+1) < maxa; k ++){
                a[(k*4+1)*(i*4+1)] = 1;
            }
        }
    }
    for(int i = 5;i < maxa; i+= 4){
        if(a[i] == 0){
            for(int k = 5; k*i < maxa; k+=4){
                if(a[k] == 0){
                    b[i*k] = 1;
                }
            }
        }
    }
    for(int i = 1; i < maxa; i++){
        ans[i] = ans[i-1]+b[i];
    }
    int n;
    while(scanf("%d", &n) , n){
        printf("%d %d\n", n, ans[n]);
    }
}
View Code

 

posted @ 2015-02-02 10:05  icodefive  阅读(128)  评论(0编辑  收藏  举报