想将一个整数m分解为质因数乘积的形式,怎么办?
最简单的方法就是直接枚举2到sqrt(m)判断输出
实现代码:

1 #include<stdio.h> 2 #include<string.h> 3 int n; 4 int main(){ 5 scanf("%d",&n); 6 for(int i=2;i*i<=n;i++){ 7 while(n%i==0){ 8 printf("%d ",i); 9 n/=i; 10 } 11 } 12 if(n>1) printf("%d",n); 13 return 0; 14 }
时间复杂度为O(sqrt(n))
其实,我们可以借助线性筛法求质数过程中所求出的每个数的最小质因数来提升效率
关于质数的线性筛法可以看我的一篇随笔:http://www.cnblogs.com/lpl-bys/p/7726113.html
因为我们已经知道了每个数的最小质因数,所以我们每次输出这个数m的最小质因数,然后m再去除以它的最小质因数,然后再查表找到除后的数的最小质因数输出......直到m==1
实现代码:

1 #include<stdio.h> 2 #include<string.h> 3 #define maxn 23333333 4 bool zs[maxn]; 5 int prime[maxn],n,num,an[maxn]; 6 int main(){ 7 memset(zs,0,sizeof(zs)); 8 scanf("%d",&n); 9 zs[0]=zs[1]=1;num=0; 10 for(int i=2;i<=n;i++){ 11 if(!zs[i]) prime[++num]=an[i]=i; 12 for(int j=1;j<=num&&i*prime[j]<=n;j++){ 13 zs[i*prime[j]]=1; 14 an[i*prime[j]]=prime[j]; 15 if(!(i%prime[j])) break; 16 } 17 } 18 while(n>1){ 19 printf("%d ",an[n]); 20 n/=an[n]; 21 } 22 return 0; 23 }