约数个数定理
编辑
对于一个大于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;
}