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的商,作為新的正整...