初级-质因数分解

题目描述:任意一个正整数可以分解成唯一的质因数的乘积,给出正整数,请计算出它的质因数分解式。
  输入:包含多个样例,每行一个正整数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 }

 

posted @ 2017-07-13 14:47  某某璀  阅读(591)  评论(0编辑  收藏  举报
levels of contents