您的位置:首页 > 其它

993 How many integers can you find

2015-07-30 00:43 309 查看


How many integers can you find

时间限制:1000 ms  |  内存限制:65535 KB
难度:1

描述

给你三个数,n,m1,m2,找出所有小于n的能被m1或m2整除的数的个数。



输入输入包含多组测试数据,每组数据占一行。

0<n<2^31,0<m1,m2<=10。
输出每组数据输出占一行。
样例输入
12 2 3


样例输出
7


这个题考察的比较巧妙,求有 1到n (不包括 n )中有多少个数能整除 a 或 b ,那么就直接用 n-1 除以a,加上 n-1除以b,再减去 n-1 除以他们的最小公倍数,具体为什么自己想,这个很好想这个规律的....嘿嘿....

注意n比较大,其他方法会超时的,只有这个规律可以搞定!

超时代码....

这样枚举很实用,但是有时候效率太低...

#include<stdio.h>
int main()
{
int i,n,m1,m2,s;
while(scanf("%d%d%d",&n,&m1,&m2)!=EOF)
{
s=0;
for(i=1;i<n;i++)
{
if(i%2==0||i%3==0)
s++;
}
printf("%d\n",s);
}
return 0;
}

ac代码:

#include<stdio.h>
int gcd(int a,int b)
{
for(int i=a%b;i!=0;i=a%b)
{
a=b;b=i;
}
return b;//返回的是最大公约数
}
int gbd(int a, int b)
{
return a/gcd(a,b)*b;//这样写是为了防止溢出....
}
int main()
{
int n,a,b,s;
while(~scanf("%d%d%d",&n,&a,&b))
{
--n;//边界舍去..
s=n/a+n/b-n/gbd(a,b);//求出结果...
printf("%d\n",s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: