suau 公约公倍
8619 公约公倍
时间限制:500MS 内存限制:1000K
提交次数:475 通过次数:108
题型: 编程题 语言: G++;GCC
Description
给定六个正整数a,b,c,d,e,f;问你是否存在整数既是a,b,c的最大公约的倍数,同时又是d,e,f的最小公倍数的约数。
输入格式
输入为多case输入,每个case只有一行,每行六个正整数。当输入6个0时结束。
输出格式
存在输出YES,否则输出:NO
输入样例
32 40 16 20 30 24
0 0 0 0 0 0
输出样例
YES
提示
32,40,16的最大公约数是:8;而20,30,24的最小公倍数为120,显然存在整数(如24),既是8的倍数,又是120的约数
题目很容易理解,首先要找出a,b,c的最大公约数,用辗转相除法即可,而d,e,f的最小公倍数,最小公倍数就是两个数的乘积除以他们的最大公约数。那么,我们不难写出来。
#include <stdio.h>
long long int a,b,c,d,e,f;
long long int fun(long long int n,long long int m)
{
long long int t;
if (n<m)
{
t=n;n=m;m=t;
}
while (m!=0)
{
t=n%m;
n=m;
m=t;
}
return n;
}
void work()
{
long long int number=fun(fun(a,b),c);
long long int temp1 = d*e/fun(d,e);
long long int number1 = f*temp1/fun(temp1,f);
long long int i;
long long int j;
int flag=0;
for (i=number;i<=number1;i=i+number)//即可筛出是number的倍数
{
if (number1%i==0)
{
printf ("YES\n");
flag=1;
break;
}
}
if (flag==0)
{
printf ("NO\n");
}
return ;
}
int main()
{
while (scanf ("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&e,&f)&&(a||b||c||d||e||f))
{
work();
}
return 0;
}
一开始做的时候,WA了很多次,原因原来是溢出啊。题目说的整数,那就是int了,但是,在算最小公倍数的时候出现了乘法,那就要注意了,会溢出。10亿*10亿就爆int了。
用了筛法就可以省点时间了。
既然选择了远方,就要风雨兼程~
posted on 2015-11-25 15:42 stupid_one 阅读(412) 评论(0) 收藏 举报
浙公网安备 33010602011771号