1. 程式人生 > >分解素因數

分解素因數

素數篩選法 spa 一個 tin font == 兩個 示例 +=

題目描述

求正整數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 }

分解素因數