定义一个有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, ans[n]); } }