王道机试指南 习题6.7 约数的个数
题目:
思路:
暴力解法会超时,不能全部遍历。
对于数num,可以只依次检查1~sqrt(num)之间的数j能否整除num:
对于小于sqrt(num)的数j,如果num%j==0且j*j!=num,则必定还存在一个大于sqrt(num)的数j0,使得j*j0=num,算两个约数;如果num%j==0且j*j==num,说明j==j0,算一个约数。
代码:
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
while(cin>>n){
vector<int> arr;
for(int i=0;i<n;i++){
int x;
cin>>x;
arr.push_back(x);
}
for(int i=0;i<n;i++){
int count=0;
int num=arr[i];
for(int j=1;j<=sqrt(num);j++){//对于数num,可以只依次检查1~sqrt(num)之间的数j能否整除num
if(num%j==0 && j*j!=num) {//对于小于sqrt(num)的数j,如果num%j==0且j*j!=num,则必定还存在一个大于sqrt(num)的数j0,使得j*j0=num,算两个约数
count=count+2;
}
else if(num%j==0 && j*j==num){//如果num%j==0且j*j==num,说明j==j0,算一个约数
count=count+1;
}
}
cout<<count<<endl;
}
}
return 0;
}
运行结果:
查看25道真题和解析