初级-质因数分解
题目描述:任意一个正整数可以分解成唯一的质因数的乘积,给出正整数,请计算出它的质因数分解式。
输入:包含多个样例,每行一个正整数2<=k<=10^8,当输入0时,表示输入结束。
输出:每行输出一个对应结果。使用”^”表示幂,”*”表示乘,质因子应该按从小到大的顺序输出,如果某一个质因子只有一次,那么就不要输出它的幂。
样例输入:
20
100
0
样例输出:
2^2*5
2^2*5^2
分析:根据题意可知k的范围在10^8以内,所以我们只需要打表到sqrt(10^8)即可,因为如果在sqrt(10^8)以内还没有找到一个质因数,那么k的值一定是个素数,所以我们可以先筛法打表保存10000以内的素数,然后把n分解成一个个素数相乘,并保存质因数与其幂,最后输出即可。
在判断开根号时,最好使用i*i<=N,而不是i<=sqrt(N),因为计算乘法速度更快。
1 #include <stdio.h> 2 3 #define N 10000 4 5 char prime[N]={'1','1'}; 6 7 int main(){ 8 9 int a[100],b[100]; 10 int i,k,d,z,j; 11 12 for(i=2;i*i<=N;i++){ 13 if(prime[i] != '1'){ 14 for(j=i*i;j<=N;j+=i) 15 prime[j] = '1'; 16 } 17 } 18 19 while(scanf("%d",&k),k){ 20 21 d=0; 22 z=2; 23 //若剩下的k>z*z了表示k一定是个质数 24 while(z*z<=k){ 25 //求出z的幂 26 if(k%z==0){ 27 i=0; 28 while(k%z==0){ 29 k/=z; 30 i++; 31 } 32 a[d]=z; 33 b[d]=i; 34 d++; 35 } 36 if(z<=N) 37 while(prime[++z] == '1'); 38 else 39 z++; 40 } 41 //若剩下的是一个素数 42 if(k!=1){ 43 a[d]=k; 44 b[d]=1; 45 d++; 46 } 47 48 for(i=0;i<d-1;i++){ 49 if(b[i]==1) 50 printf("%d*",a[i]); 51 else 52 printf("%d^%d*",a[i],b[i]); 53 } 54 55 if(b[i]==1) 56 printf("%d\n",a[i]); 57 else 58 printf("%d^%d\n",a[i],b[i]); 59 } 60 return 0; 61 }
作者:pngcui
博客园:http://www.cnblogs.com/pngcui/
github:https://github.com/pngcui
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。