suau 公约公倍

8619 公约公倍

时间限制:500MS  内存限制:1000K
提交次数:475 通过次数:108

题型: 编程题   语言: G++;GCC

Description

 给定六个正整数a,b,c,d,e,f;问你是否存在整数既是a,b,c的最大公约的倍数,同时又是d,e,f的最小公倍数的约数。 


输入格式

 输入为多case输入,每个case只有一行,每行六个正整数。当输入60时结束。



输出格式

 存在输出YES,否则输出:NO




输入样例

32 40 16 20 30 24
0 0 0 0 0 0

输出样例

 YES 


提示

 32,40,16的最大公约数是:8;而203024的最小公倍数为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  阅读(399)  评论(0编辑  收藏  举报

导航