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 阅读(399) 评论(0) 编辑 收藏 举报