【枚举】因子个数

题目描述

对于任意给定的一个正整数,计算其因数个数。

输入样例:

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;
}
posted @ 2021-06-05 22:42  咸鱼爱学习  阅读(459)  评论(0编辑  收藏  举报