直接枚举,注意数字大于1000000且为质数的情况要特殊处理。
#include <stdio.h>
#include <math.h>
int prime_table[1000000];
bool is_prime(int n)
{
int i, end;
bool f;
if(1 == n)
return false;
if(n!=2 && n%2==0)
return false;
end = floor(sqrt((double)n)+0.5);
f = true;
for(i=2; i<=end; i++)
{
if(0 == n%i)
{
f = false;
break;
}
}
return f;
}
//初始化素数表
void init_prime_table()
{
int i;
int count;
count = 0;
for(i=1; i<=1000000; i++)
{
if(is_prime(i))
prime_table[count++] = i;
}
}
void func(long long n)
{
int i;
for(i=0; i<1000000&&prime_table[i]&&prime_table[i]<=n; i++)
{
if(1 == n)
break;
if(n%prime_table[i] == 0)
{
n = n/prime_table[i];
printf(" %d\n", prime_table[i]);
i = -1;
}
}
if(n > 1000000)
printf(" %lld\n", n);
printf("\n");
}
int main(void)
{
long long n;
init_prime_table();
while(1)
{
scanf("%lld", &n);
if(n < 0)
break;
func(n);
}
return 0;
}