您的位置:首页 > 其它

习题10-9 UVA 294 Divisors(约数)

2016-02-03 19:47 295 查看
看到这个题,一看U-L <= 10000感觉数据量好小啊,就果断尝试做做。

让你找一个数的正因子个数,感觉应该不是硬来的,就百度了一下,果然有比较简单的方法:

找一个数X的约数个数:

根据唯一分解定理:可以把整数X分解成若干素数相乘的形式:X = (P1^a1 )× (P2^a2 )× (P3^a3 )......

那么X的正因子个数就等于 (a1+1) × (a2+1) × (a3+1)......

所以思路就很清晰了:

1.先从L到H遍历 才1W,

2.然后对遍历的每一个数进行找素数,可以放到map里面,

3.最后遍历map即可!

注意:

遍历素数时,一定是 <= sqrt 而不是 < 因为这错了1次。。

代码如下:

#include<map>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,L,H;
scanf("%d",&n);
while(n--){
scanf("%d%d",&L,&H);
int sum = -1,key;
for (int i = L; i <= H; ++i){
map<int,int>m;
if (i == 1){if (1 > sum){sum = 1;key = i;}continue;}
int temp = 1,ii = i;
for (int k = 2; k <= sqrt(ii); ++k){
if (ii % k == 0){
if (!m.count(k))m[k]=0;
m[k]++;
ii/=k;
k = 1;
}
}
if (ii != 1 && !m.count(ii))m[ii]=0;m[ii]++;
for (map<int,int>::iterator it = m.begin() ;it != m.end(); ++it)temp *= (it->second + 1);
if (temp > sum){sum = temp;key=i;}
}
printf("Between %d and %d, %d has a maximum of %d divisors.\n",L,H,key,sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: