算數基本定理求約數個數
阿新 • • 發佈:2018-12-11
題目:最多約數問題
正整數x 的約數是能整除x的正整數,其約數的個數記為div(x),例如div(10)=4。
設a 和b 是兩個正整數,找出a 和b 之間約數個數最多的數x 的約數個數。
樣例輸入: 1 36
樣例輸出: 9
算數基本定理:又稱為正整數的唯一分解定理,即:每個大於1的自然數要麼它本身就是質數或者要麼它可寫為質數的積,而且這些質因子按大小排列之後,寫法僅有一種方式。例如: ,。(注意:0,1都不屬於質數)
那麼如何求出每個數的約數個數?算數基本定理可以將每個數分解為 質數^指數 乘積的形式,我們又知道質數的隨機匹配可以生成合數,那麼匹配數的總和就是這個要求的數的約數個數。
打個比方:6936 = 2^3 * 3 * 17^2,一共有三個2,一個3和兩個17可以組合,三個2可以拿出的組合數為四種(0,1,2,3),同理3兩種(0,1),17三種(0,1,2),組合到一塊即 4*2*3 = 24,即6936共有24個約數。
#include <iostream> #include <cmath> #include <algorithm> #include <cstring> #include<ctime> using namespace std; int div(int n){ int ans = 1; int limit = (int)sqrt(n); for(int i=2;i<=limit;++i){ int tmp = 0; while(n%i == 0){ n /= i; ++tmp; } if(tmp) ans *= (tmp+1); } if(n > 1) ans *= 2; return ans; } int main(){ int a,b; while(cin >> a >> b){ //clock_t start = clock(); int num_a = div(a); int num_b = div(b); //clock_t end = clock(); cout << (num_a >= num_b ? num_a : num_b) << endl; //cout << "alg2 cost " << (end-start)/CLOCKS_PER_SEC << " seconds" << endl; } return 0; }