分解素因数

Posted yuxiaoba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分解素因数相关的知识,希望对你有一定的参考价值。

 

题目描述

 

求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。

输入描述:

可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。

输出描述:

对于每组数据,输出N的质因数的个数。
示例1

输入

120

输出

5

解题思路:利用素数筛选法预先筛选出在数据范围内的素数,然后判断其是否为n的因数。若确定某素数为n的因数,则通过试除确定其对应的幂指数,最后求出各个幂指数的和即为所求

                  还有一个问题是素数筛选只筛选到100000即可。因为n至多存在一个大于sqrt(n)的素因数(否则两个大于sqrt(n)的数相乘即大于n)。因而只有将n所有小于sqrt(n)的素数从n中除去,剩余的部分必为该大素因数,并且有且仅有一个。

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 void Init();
 5 
 6 int mark[100001];
 7 int prime[10001];
 8 int primeSize;
 9 
10 int main()
11 {
12     int n;
13 //    int ansPrime[30];//按顺序保存分解出的素因数
14     int ansSize,ans;  //分解出素因数个数
15     int ansNum[30];   //保存素因数的幂数
16     int i;
17     Init();
18 
19     while( scanf("%d",&n)!=EOF)
20     {
21         ansSize = 0;
22         ans = 0;
23 
24         for( i=0; i<primeSize; i++)
25         {
26             if( n%prime[i]==0 )
27             {
28 //                ansPrime[ansSize] = prime[i];
29                 ansNum[ansSize] = 0;
30                 while( n%prime[i]==0)
31                 {
32                     ansNum[ansSize]++;
33                     n /= prime[i];
34                 }
35                 ansSize++;
36                 if( n==1 ) break;  //n变为1表明n的所有素因素全部分解完
37             }
38         }
39         if( n!=1)
40         {
41             //若测试完到100000内的素数.n仍被分解为1,则下一个因素一定是此时的n
42 //            ansPrime[ansSize] = n;
43             ansNum[ ansSize++] = 1;  //其幂指数一定是1
44         }
45         for(i=0; i<ansSize; i++ )
46         {
47             ans += ansNum[i];
48         }
49         printf("%d\n",ans);
50     }
51     return 0;
52 }
53 
54 void Init()
55 {
56     int i,j;
57     primeSize=0;
58 
59     for( i=1; i<=100000; i++)
60     {
61         mark[i] = 0;
62     }
63     for( i=2; i<100000; i++)
64     {
65         if( mark[i]==1) continue;
66         prime[primeSize++] = i;
67         if(i >=1000) continue;
68         for( j=i*i; j<100000; j+=i)
69         {
70             mark[j] = 1;
71         }
72     }
73 }

 

以上是关于分解素因数的主要内容,如果未能解决你的问题,请参考以下文章

我只是不确定我哪里出错了。编写一个程序以打印出 c 中的素因数分解并与它一起练习链接

HDU 4497 GCD and LCM (分解质因数)

唯一分解定理入门

求最小公倍数和最大公约数

Luogu P1075 质因数分解题解

2的幂的python itertools排列太慢了