约数个数定理

约数个数定理

编辑
对于一个大于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<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
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;i++)
    {
        sum=sum*(b[i]+1);
    }
    return sum;
}
int main()
{
    int t;
    cin>>t;
        while(t--){
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        long n;
        cin>>n;
        getyue(n);
        int ac=getac();
        cout<<ac<<endl;
        cnt=0;
        }
    return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值