zoukankan      html  css  js  c++  java
  • 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
    ");
    		   flag=1;
    		   break;
    	   }
       }
       if (flag==0)
       {
          printf ("NO
    ");
       }
       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了。

          用了筛法就可以省点时间了。

  • 相关阅读:
    每天干攻防,都不会写驱动了
    SSD 坏了
    据说英雄联盟要出新皮肤了
    随便写点什么,证明我还活着,VS2010出现的问题
    ida 符号路径设置
    搭建一个自己的SVN服务器
    nginx+keepalived互为主主高可用配置
    nginx+keepalived主从高可用配置
    Lnamp的高级网站架构+动静分离+反向代理
    Nginx+PHP(FastCGI)高性能服务器加载redis+memcache模块
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/4994897.html
Copyright © 2011-2022 走看看