很巧妙的一道题。我是没能想到这么巧的方法,唉,差距真不是那么一点点啊...
附原题标程:
#include<stdio.h>
#define N 1000010
int ans[N]={0},a;
void prime()
{
int i,j,x=0;
for( i=2; i<N; i++)
if( ans[i] == 0 )
{
x++;
for(j=i; j<N; j+=i) //素数的整倍数的最大素因子可能是该素数
ans[j] = x; //更新素数对应的出现的次序
}
}
main()
{
prime();
while( scanf ( "%d" , &a ) != EOF )
printf ( "%d\n", ans[a] );
}
我模仿着写的一个
#include <cstdio>
#define MAX 1000000 + 2
int a[MAX];
void Count(){
for(int i = 2, count = 0; i < MAX; ++i){
if(!a[i]){
++count;
for(int j = i; j < MAX; j += i)
a[j] = count; //该素数的倍数的最大素因子可能是这个值,如果不是,以后可更新
}
}
}
int main(){
int n;
Count();
while(scanf("%d", &n) == 1)
printf("%d\n", a[n]);
return 0;
}