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

看到这个题,一看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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值