/*
Problem Description
假设x是一个正整数,它的值不超过65535(即1<x<=65535),请编写一个程序,将x分解为若干个素数的乘积。
Input
输入的第一行含一个正整数k (1<=k<=10),表示测试例的个数,后面紧接着k行,每行对应一个测试例,包含一个正整数x。
Output
每个测试例对应一行输出,输出x的素数乘积表示式,式中的素数从小到大排列,两个素数之间用“*”表示乘法。
Sample Input
2
11
9828
Sample Output
11
2*2*3*3*3*7*13
*/
#include <stdio.h>
#define N 65535
int primeNum[N];
bool isPrime[N];
int is_prime();
int main()
{
int i,count;
int k,num;
int primeFactor[40],lenPF;
count=is_prime();
scanf("%d",&k);
while(k--)
{
lenPF=0;
scanf("%d",&num);
if(isPrime[num])
{
printf("%d\n",num);
continue;
}
for(i=0;i<count;i++)
{
while(num%primeNum[i]==0&&num>0)
{
primeFactor[lenPF++]=primeNum[i];
num/=primeNum[i];
if(isPrime[num])
{
primeFactor[lenPF++]=num;
i=count;
break;
}
}
}
printf("%d",primeFactor[0]);
for(i=1;i<lenPF;i++)
{
printf("*%d",primeFactor[i]);
}
printf("\n");
}
return 0;
}
int is_prime()
{
int num=0;
int i,j;
for(i=0;i<N;i++)
{
primeNum[i]=-1;
isPrime[i]=true;
}
isPrime[0]=isPrime[1]=false;
for(i=2;i<N;i++)
{
if(isPrime[i])
primeNum[num++]=i;
for(j=0;j<num;j++)
{
if(i*primeNum[j]>N) break;
isPrime[i*primeNum[j]]=false;
if(!(i%primeNum[j])) break;
}
}
return num;
}
使用筛法得出65535之内的所有素数,再进行素因子分解