質因子分解

2021-09-26 15:40:24 字數 2143 閱讀 8562

所謂質因子分解是指將乙個正整數n寫成乙個或多個指數的乘積的形式,例如6=2*3,8=2*2*2,180=2*2*2*3*3*5。或者也可以寫成指數的形式,例如6=2^1*3^1,8=2^3,180=2^2*3^2*5^1。由此可以發現,質因子都是素數,不防先列印出其素數表,再進行記錄。

由於每乙個質因子都可以不止出現一次,因此不防定義結構體factor,用來存放質因子以及個數。如下:

struct factor fac[10];
考慮到前10個素數相乘的結果已經超過了int的範圍。因此對乙個int型範圍的數來說,fac陣列的大小只需要開到10就可以了。對乙個正整數n來說,如果它存在1和本身之外的因子,那麼一定是在sqrt(n)的左右成對出現。而這裡把這個結論用在「質因子」上面,會得到乙個強化結論:對乙個正整數n來說,如果它存在[2,n]範圍內的質因子,要麼這些質因子全部小於等於sqrt(n),要麼只存在乙個大於sqrt(n)的質因子,而其餘質因子全部小於等於sqrt(n)。這就給進行質因子分解提供了乙個很好的思路:

①列舉1~sqrt(n)範圍內的所有質因子p,判斷p是否是n的因子。

if(n%prime[i]==0) 

num++;//不同質因子數加 1

}

if(n==1) 

break; //及時退出迴圈,節省時間

②如果在上面步驟結束後n仍然大於1,說明n有且僅有乙個大於sart(n)的質因子(有可能是n本身),這時需要把這個質因子加入fac陣列,並令其個數為1。

if(n!=1)
#include//定義乙個結構體,存放質因子以及其個數 

const int maxn = 100010; //表長

int prime[maxn],pnum=0; //prime陣列存放所有素數,pnum為素數個數

bool p[maxn] = ; //如果i為素數,則p[i]為false;否則p[i]為true

int num=0; //儲存不同質因子的個數

struct facto***c[10];

//篩選法列印素數表

void find_prime(int n)

} printf("%d^%d\n",fac[num-1].x,fac[num-1].cnt);

//初始化陣列

在以上的**中,只要輸入的數比較大就會出現程式異常,出現下圖所示:

在以上的****現這個原因在於列印素數表時,我們以輸入的n為引數,如果n過大,執行超時導致異常:

//篩選法列印素數表

void find_prime(int n) ; //如果i為素數,則p[i]為false;否則p[i]為true

int num=0; //儲存不同質因子的個數

struct facto***c[10];

//篩選法列印素數表

void find_prime()

} printf("%d^%d\n",fac[num-1].x,fac[num-1].cnt);

//初始化陣列

不使用素數表而直接列印輸出的方法:

#include#includeint main()

} if(n!=1)

printf("%d",n);

printf("\n");

} return 0;

}

素數使用練習題:

prime factors

質分解因數 質因子分解

3 參考 分解因數 時間限制 1000 ms 記憶體限制 32768 kb 長度限制 100 kb 判斷程式 standard 來自 小小 題目描述 所謂因子分解,就是把給定的正整數a,分解成若干個素數的乘積,即 a a1 a2 a3 an,並且 1 a1 a2 a3 an。其中a1 a2 an均為...

質因子分解

今天沒事做,我們來寫個部落格,混混等級!我們以求數的質因子的個數為例來講解。對於質因子分解最簡單最純粹的暴力我相信大家都會的。int getnum int x return ans 但是當處理的資料比較多,而且範圍也比較大的時候顯然這種方式就不再那麼適合了。既然我們是分解質因子,那麼我們就可以先預處...

質因子分解

這個東西會在程式執行結尾提示 press any key to continue 用以結束程式。貴在那裡?讓我們來看看system pause 的流程 1 暫停你的程式 2 在sub process中啟動os 3 尋找要執行的命令並為之分配記憶體 4 等待輸入 5 記憶體 6 結束os 7 繼續你的...