1. 程式人生 > >1-3:最多約數問題

1-3:最多約數問題

最多約數問題。正整數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;
}