文章
40
粉丝
607
获赞
68
访问
419.5k
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int N,n,i,s,r;
while(cin>>N){ //N表示要求几个数的约数个数
while(N--){
cin >> n; //n表示要求约数个数的数字
s = 1; //n约数的个数
for (i = 2; i * i <= n; i++) { //质因数只会小于等于根号n;这里i * i <= n即可
r = 0; //约数个数定理中质约数的幂次
while (n % i == 0) { //n能整除质数的时候,i相应的表示质数
r++; //r表示n能整除这个质数几次
n /= i;
}
if (r > 0) { //约数个数定理求约数个数
r++;
s *= r;
}
}
if (n > 1){ //n>1说明n本身就是质数,此时s=1,约数只有1和它本身,故乘2
s *= 2;
}
cout << s << endl;
}
}
return 0;
}
首先这个题目是用约数个数定理来求解的,直接暴力遍历会超时。
在使用约数个数定理之前,要知道:
1、任何一个大于1的整数,都能分解成若干质数相乘(例:n=12;12=2*2*3)
2、n的质数约数只会出现在1~根号n之间(例:25的质约数只会在1~5之间出现)
...
登录后发布评论
暂无评论,来抢沙发