题目描述
对于任意给定的一个正整数,计算其因数个数。
输入样例:
6
输出样例:
4
说明:
1、2、3、6都是6的因数。因此,输出4。
输入
输入正整数N。
输出
输出N的因子个数。
样例输入
6
样例输出
4
数据范围限制
1<=N<2^31
提示
1、2、3、6都是6的因数。因此,输出4。
分析
结合题面和样例发现,求得是数字的因子的个数。一种朴素的方法就是遍历所有1~N范围内的值,找出所有的x的因子,进行统计。
若a是b的因子,应当满足b%a==0
。
结构
int cnt=0;
for(int i=1;i<=n;i++){
if(n%i==0) cnt++;
}
但是,结合数据范围分析,能够发现,范围过大,O(n)级别的算***超时。此时就要想办法优化一下。
结合我们以前做过的质数判断的题目,找因子的话实际上到 $ \sqrt{n} $就够了,不需要完整的遍历到n。分析下复杂度O( $ \sqrt{n} $).n是最大\(2^{31}\) ,开根号后大概是\(10^{4} - 10^{5}\)之间,是在时间限制内的。
对于根号的处理要注意 类似25这个数字,存在\(5\times5=25\)的情况,因子只要计算一个,其他情况下,找到一个就算两个因子。
另外要注意范围,根号后范围接近\(10^5\) ,平方后易超过int范围,故使用long long 类型进行处理。
代码实现
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
long long x,cnt=0,i;
cin>>x;
for(i=1;i*i<x;i++){
if(x%i==0) cnt+=2;
}
if(i*i==x) cnt++;
cout<<cnt;
return 0;
}