• 筛数法,先求质数表,再根据表判断质因数,统计质因数的指数
  • 根据因数个数定理:因数总数=(各质因数指数+1)的乘积
#include<iostream>
#include<vector>
using namespace std;
const int maxn=4e4;
vector<int>prime;

void initial(){//构造质数表
    int shaishu[maxn];
    shaishu[0]=shaishu[1]=0;
    for(int i=2;i<maxn;i++)shaishu[i]=1;
    for(int i=2;i<maxn;i++){
        if(shaishu[i]==0)continue;
        else{
            prime.push_back(i);
            if(i>maxn/i)continue;
            for(int j=i*i;j<maxn;j+=i){
                shaishu[j]=0;
            }
        }
    }
}
int main(){
    initial();
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            int x;
            scanf("%d",&x);
            int sum=1;
            for(int i=0;i<prime.size()&&prime[i]<=x;i++){
                int k=0;//质因数的指数
                while(x%prime[i]==0){
                    k++;
                    x=x/prime[i];
                }
                sum=sum*(1+k);
            }
            if(x!=1)sum=sum*2;
            printf("%d\n",sum);
        }
    }
    return 0;
}

  • 直接计数:因数总是成对出现,只考虑i²<n的一半因数,注意完全平方数时,有一个单独因数
#include<iostream>
#include<vector>
using namespace std;
const int maxn=4e4;
vector<int>prime;

int getans(int x){//求因数总数
    int sum=0;
    int i;
    for(i=1;i*i<x;i++){
        if(x%i==0)sum++;
    }
    sum*=2;
    if(i*i==x)sum++;
    return sum;
 
}
int main(){

    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            int x;
            scanf("%d",&x);
          
            printf("%d\n",getans(x));
        }
    }
    return 0;
}