题目:最多约数问题
正整数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;
}