数学算法:一个数的因子数为所有素因子的个数加1的乘积(素因子是因子为素数的数)例如:12的因子数为6。素因子有2和3分别有2,1个,即为(2+1)*(1+1)=6;
核心思想:建立一个素数表,然后求输入n的素因子和其所对应的个数,显然用Map实现,最后求因子数。
#include<iostream>
#include<map>
#include<cmath>
using namespace std;
int w[6600]={2};
bool isPrime(int n){//判断n是否为素数
for(int i=2;i<=sqrt(n);i++){
if(n%i==0) return false;
}
return true;
}
int main(){
int num=1;
int n;//输入的数
for(int i=3;i<(1<<16);i+=2){//构建2的16次方的素数表
if(isPrime(i))
w[num++]=i;
}
while(cin>>n){
cout<<n<<": ";
map<int,int> ma;//ma临时变量
map<int,int>::iterator it;
for(int i=0;n!=1&&i<n;){
if(n%w[i]) i++;//w[i]不是n的素因子
else{
ma[w[i]]++;//w[i]的素因子个数加1
n=n/w[i];//继续循环
}
}
if(n>(1<<16)) ma[n]++;
int sum=1;
//一个数的因子总数为所有素因子个数加1的乘积
for(it=ma.begin();it!=ma.end();it++)//用map存放所有的素因子和它所对应的个数
sum=sum*(1+it->second);
cout<<sum<<endl;
}
}