题目描述
输入的第一行为N,即数组的个数(N<=1000) 接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000),输入n个整数,依次输出每个数的约数的个数
输入样例
输入:
5
1 3 4 6 12
复制
输出:
1
2
3
4
6
约束定理
对于一个大于1正整数n可以分解质因数:n = p1a1*p2a2*…pk^ak,则n的正约数的个数就是 :(a1+1)(a2+1)…*(ak+1)
其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。
实现代码
#include <iostream>
#include<string>
#include<vector>
#include<cctype>
#include<algorithm>
#include<map>
#include<math.h>
#include<bits/stdc++.h>
#define maxlength 1002
#define ll long long
using namespace std;
ll countprim(ll n)
{
ll sum = 1;
/* x = p1^a1*p2^a2*p3^a3...pk^ak
yueshu = (a1+1)*(a2+1)*...*(ak+1)*/
for(ll i = 2; i*i <= n; i++)
{
int cou = 0;//cou用来计算指数
if(n%i==0)//如果i是n的因子
{
cou = 1;
//不断除求指数,比如12=2^2*3
n /= i;
while(n%i==0)
{
cou++;
n /= i;
}
}
if(cou != 0)
{
sum = sum*(cou+1);
}
}
//如果是60=1*2^2*3*5,此时因数为:1,2,4,3,6,12,以及加上它们分别乘以5都是60的因数
if(n != 1)
{
sum = sum*2;
}
//如果是1的情况
if(sum==1 && n==1)
{
sum = 1;
}
return sum;
}
int main()
{
int n;
while(cin>>n)
{
ll *p=new ll[maxlength];
ll a;
for(int i=0;i<n;i++){
cin>>a;
p[i]=a;
}
for(int i=0;i<n;i++){
cout<<countprim(p[i])<<endl;
}
}
return 0;
}