1-3:最多约数问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38851184/article/details/82858746

最多约数问题。正整数x 的约数是能整除x的正整数,其约数的个数记为div(x),例如div(10)=4。设ab 是两个正整数,找出ab 之间约数个数最多的数x 的约数个数。

样例输入:

  1 36

样例输出:

  9

这道题有个数学上的知识,就是:一个合数的约数个数等于它所有质因数的次方加上一再相乘。

即:x=n1^m1+n2^m2+...+nn^mn(x为合数,n1...nn为其质因数,m1...mn为对应于其质因数的次方数),x的约数个数为:(m1+1)*(m2+1)*(m3+1)*...*(mn+1)

那么根据这个思想,代码的实现如下:

#include <bits/stdc++.h>

using namespace std;
int vis[100] = {0};
int prim[100];
int cnt=0;
void IsPrimm()
{
    int i,j;
    for( i=2; i<100; i++)
    {
        if(vis[i] == 0)
        {
            for(j=i*2; j<100; j+=i )
            {
                vis[j] = 1;
            }
        }
    }
    for(i=2; i<100; i++)
    {
        if(vis[i] == 0)
            prim[cnt++] = i;
    }
}
int f(int n)
{
    int i,t=1,k=0;
    for(i=0; i<cnt && prim[i]<=n;i++)
    {
        if(n%prim[i] == 0)
        {
            k=0;
            while(n%prim[i] == 0)
            {
                k++;
                n = n/prim[i];
            }
            t = t*(k+1);
        }
    }
    return t;
}
int main()
{
    IsPrimm();  //先求0~100所有素数
    int i,a,b,maxx = 0;
    cin>>a>>b;
    for(i=a; i<=b; i++)
    {
        if(f(i) > maxx)
            maxx = f(i);
    }
    cout<<maxx<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38851184/article/details/82858746
1-3