约数个数【模拟】

Description–

定义f(x)为x的约数个数,x为正整数。
在这里插入图片描述
=f(a)+f(a+1)+……+f(b)

  • 即a,b之间每个数的约数的总和。

Input–

一行两个正整数a、b,以一个空格隔开

Output–

一行一个整数,即答案


Sample Input–

2 6

Sample Output–

13


说明–

数据范围
对于50%的数据,1≤a≤b≤1000;
对于100%的数据,1≤a≤b≤10,000,000。


解题思路&代码–

50分的做法(超时)

  • 纯模拟
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a,b,ans;
int hhh(int x)
{
	int s=0;
	for (int i=1;i<=sqrt(x);++i)
	{
		if (x%i==0)
		  if (i==sqrt(x))
		    s++;
		  else s+=2; 
	}
	return s;
}
int main()
{
	scanf("%d%d",&a,&b);
	for (int i=a;i<=b;++i)
	  ans+=hhh(i);
	printf("%d",ans);
	
	return 0;
}

100分的做法

  • 一次性判断a~b之间的所有数是否含有约数i
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a,b,ans,t,s;
int main()
{
	scanf("%d%d",&a,&b);
	for (int i=1;i<=b;++i)
	{
		t=a;
		if (t%i!=0) t=t+(i-t%i);
		s=((b-t)/i)+1; 
		if (t<=b) ans+=s;
	} 
	printf("%d",ans);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43654542/article/details/88717225