呃,对自己表示很无奈,明明很清晰地一道题,愣是用了好长时间才做出来,不是没思路,是没整理好思路,没法写代码,好吧,以后要加强!
题目大意:所有对4取余余一的数都为H-numbers,只有1和它本身两个因子的H-numbers数为H-primes,有两个H_primes的乘机组成的H_numbers称为H-composites,题目是给你一个数,让你求1到H的所有H-composites。
方法很简单,就是筛选法,但是还有一种情况就是,不是完全有两个H_primes组成的数,这种情况要去掉。具体看代码吧。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxx 1000010 int f[maxx+10]; void init() { int i,j; memset(f,0,sizeof(f)); //f[1]=1; for(i=5;i<maxx;i+=4) { for(j=5;j<maxx && i*j < maxx;j+=4) if(!f[i] && !f[j]) f[i*j] = 1; else f[i*j] = 2; } int sum = 0; for(i=5; i<maxx ;i++) { if(f[i] == 1) sum++; f[i]=sum; } } int main() { int H,i; init(); while (scanf("%d",&H), H) { printf("%d %d\n",H,f[H]); } return 0; }