1. 程式人生 > >算數基本定理求約數個數

算數基本定理求約數個數

題目:最多約數問題

正整數x 的約數是能整除x的正整數,其約數的個數記為div(x),例如div(10)=4。

設a 和b 是兩個正整數,找出a 和b 之間約數個數最多的數x 的約數個數。

樣例輸入:   1 36

樣例輸出:   9

算數基本定理:又稱為正整數的唯一分解定理,即:每個大於1的自然數要麼它本身就是質數或者要麼它可寫為質數的積,而且這些質因子按大小排列之後,寫法僅有一種方式。例如: 6936=2^{3}\times 3\times 17^{2}1200=2^{4}\times 3\times 5^{2}。(注意: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;
}