AcWing867 分解質因數(C 演算法)

2021-10-25 09:09:15 字數 1365 閱讀 8658

1、題目:

給定n個正整數ai,將每個數分解質因數,並按照質因數從小到大的順序輸出每個質因數的底數和指數。

輸入格式

第一行包含整數n。

接下來n行,每行包含乙個正整數ai。

輸出格式

對於每個正整數ai,按照從小到大的順序輸出其分解質因數後,每個質因數的底數和指數,每個底數和指數佔一行。

每個正整數的質因數全部輸出完畢後,輸出乙個空行。

資料範圍

1≤n≤100,

1≤ai≤2∗109

輸入樣例:26

8輸出樣例:

2 13 1

2 32、基本思想:

①暴力列舉:根據求質因數的基本定義計算,時間複雜度為o(n);

②優化:根據性質(n中最多隻包含乙個大於sqrt(n)的質因子,如果有多個那麼相乘就大於n了)發現可以先列舉2到sqrt(n)算出小於等於sqrt(n)之後最後留下的那個就是大於sqrt(n)的質因子,時間複雜度最壞情況下是o(√n),最好情況下是o(logn)。

3、核心步驟:

void

divide

(int x)

cout << i <<

' '<< cnt << endl;

//輸出質因數i及其指數cnt}}

if(x >

1) cout << x <<

' '<<

1<< endl;

//輸出大於sqrt(x)的那個質因數

}

①for迴圈中的判斷語句寫成i <= x / i,是為了列舉小於等於sqrt(x)的質因子。

②因為會用while迴圈除掉x中所有的i,所以每次for迴圈中列舉到的i只要滿足x % i == 0,i就一定是質數。因為2到i-1之間的質數已經被除乾淨了,所以只要除得盡,i就一定是質數。

③如果x除完了所有小於等於sqrt(x)的質數之後依然大於1,那麼此時的x就是那個唯一的大於sqrt(x)的質數。

4、c ++ **如下(該**引用acwing****)

#include

using

namespace std;

void

divide

(int x)

cout << i <<

' '<< cnt << endl;

//輸出質因數i及其指數cnt}}

if(x >

1) cout << x <<

' '<<

1<< endl;

//輸出大於sqrt(x)的那個質因數

}int

main()

return0;

}//該**引用acwing****

Acwing 867 分解質因數

給定n個正整數ai,將每個數分解質因數,並按照質因數從小到大的順序輸出每個質因數的底數和指數。輸入格式 第一行包含整數n。接下來n行,每行包含乙個正整數ai。輸出格式 對於每個正整數aiai,按照從小到大的順序輸出其分解質因數後,每個質因數的底數和指數,每個底數和指數佔一行。每個正整數的質因數全部輸...

AcWing 867 分解質因數

給定n個正整數ai,將每個數分解質因數,並按照質因數從小到大的順序輸出每個質因數的底數和指數。輸入格式 第一行包含整數n。接下來n行,每行包含乙個正整數ai。輸出格式 對於每個正整數ai,按照從小到大的順序輸出其分解質因數後,每個質因數的底數和指數,每個底數和指數佔一行。每個正整數的質因數全部輸出完...

014 分解質因數

題目 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新的正整...