约数个数定理

约数个数定理

编辑
对于一个大于1正整数n可以 分解质因数:
 
则n的 正约数的个数就是
   
其中a 1、a 2、a 3…a k是p 1、p 2、p 3,…p k的指数。

定理简证

编辑
首先同上,n可以 分解质因数:n=p1^a1×p2^a2×p3^a3*…*pk^ak,
由约数定义可知p1^a1的约数有:p1^0, p1^1, p1^2......p1^a1 ,共(a1+1)个;同理p2^a2的 约数有(a2+1)个......pk^ak的约数有(ak+1)个。
故根据 乘法原理:n的约数的个数就是(a1+1)(a2+1)(a3+1)…(ak+1)。

例题

编辑
例题:正整数378000共有多少个 正约数?
解:将378000 分解质因数378000=2^4×3^3×5^3×7^1
由约数个数定理可知378000共有正约数(4+1)×(3+1)×(3+1)×(1+1)=160个。

以上内容来自百度百科

#include
#include
#include
#include
#include
#include
using namespace std;
long a[105];
long b[105];
long c[105];
int cnt;
void  getyue(long n)
{
    cnt=0;
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            a[cnt++]=i;
            n=n/i;
            i--;
        }
    }
    a[cnt]=n;
}
int getresult()
{
    int sum=0;
    for(int i=0;i<=cnt;i++)
    {
        if(a[i]==a[i+1])
        {
            b[sum]++;
        }
        else{
           b[sum]++;
           sum++;
        }
    }
    return sum;
}
int getac()
{
    int t=getresult();
    int sum=1;
    for(int i=0;i>t;
        while(t--){
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        long n;
        cin>>n;
        getyue(n);
        int ac=getac();
        cout<

你可能感兴趣的:(oj)