方法一:
直接统计约数的个数:从 1遍历到 sqrt(n),只是某些情况下可能会超时。
#include<bits/stdc++.h>
using namespace std;
int num(int n) {
int ans=0;
int i;
for(i=1; i*i<n; i++) {
if(n%i==0) {
ans+=2;
}
}
if(i*i==n) {
ans++;
}
return ans;
}
int main() {
int n;
while(scanf("%d",&n)!=EOF) {
int a;
for(int i=0; i<n; i++) {
scanf("%d",&a);
printf("%d\n",num(a));
}
}
return 0;
}
方法二:
求出该数的所有素因数和以及相应的个数,比如12=2^2*3 素因数为2和3,对应的指数为2和1
因数的个数=(素因数a1的指数+1)*(素因数a2的指数+1)*.....
#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int mark[N];
int primeSize;
int prime[N];
void init() {
primeSize=0;
for(int i=2; i<=100000; i++) {
if(mark[i]==1) {
continue;
}
prime[primeSize++]=i;
if(i>=1000) continue;
for(int j=i*i; j<=100000; j+=i) {
mark[j]=1;
}
}
}
int main() {
init();
int n;
while(scanf("%d",&n)!=EOF) {
int a;
while(n--) {
scanf("%d",&a);
if(a==1) {
printf("1\n");
} else {
int ansPrime[50];
int ansSize=0;
int ansNum[50];
for(int i=0; i<primeSize; i++) {
if(a%prime[i]==0) {
ansPrime[ansSize]=prime[i];
ansNum[ansSize]=0;
while(a%prime[i]==0) {
ansNum[ansSize]++;
a/=prime[i];
}
ansSize++;
if(a==1) {
break;
}
}
}
if(a!=1) {
ansPrime[ansSize]=a;
ansNum[ansSize++]=1;
}
int sum=1;
for(int j=0; j<ansSize; j++) {
sum=sum*(ansNum[j]+1);
}
printf("%d\n",sum);
}
}
}
return 0;
}