zoukankan      html  css  js  c++  java
  • HDU 2028 Lowest Common Multiple Plus

    Lowest Common Multiple Plus



    Problem Description
    求n个数的最小公倍数。

     

    Input
    输入包括多个測试实例。每一个測试实例的開始是一个正整数n。然后是n个正整数。
     

    Output
    为每组測试数据输出它们的最小公倍数。每一个測试实例的输出占一行。

    你能够如果最后的输出是一个32位的整数。

     

    Sample Input
    2 4 6 3 2 5 7
     

    Sample Output
    12 70
     
    这道题对我的启示非常大。尽管是一道非常easy的题,但还是Wrong Answer了好几次。
    #include<stdio.h>
    
    int GCD(long n,long m)
    {
    	long i;
    	if(n <m)
    	{
    		long t = n;
    		n = m;
    		m = t;
    	}
    	for(i = m;i >=1;i --)
    	{
    		if(n%i == 0&&m%i == 0)
    			return i;
    	}
    }
    int main(void)
    {
    	int a,t,max,min;
    	int n;
    
    	while(scanf("%d",&n)!=EOF)
    	{
    		max = min = 1;
    		a = max/min;
    		while(n --)
    		{
    			scanf("%d",&t);
    			min = GCD(a,t);
    			max = a * t;
    			a = max/min;
    		}
    		printf("%d
    ",a);
    	}
    }
    代码是这种。思路就是不断的两两求最小公倍数。可是认为会错非常疑惑。就去网上看了一些前辈的解答。发现他们都提到了公约数的位置的问题,即一定要先除公约数,否则假设先相乘的话会超出int的范围。

    改进后:
    #include<stdio.h>
    
    int GCD(long n,long m)             //求最大公约数
    {
    	int i;
    	if(n <m)
    	{
    		int t = n;
    		n = m;
    		m = t;
    	}
    	for(i = m;i >=1;i --)
    	{
    		if(n%i == 0&&m%i == 0)
    			return i;
    	}
    }
    int main(void)
    {
    	int a,t,gcd;
    	int n;
    
    	while(scanf("%d",&n)!=EOF)
    	{
    		a = 1;
    		while(n --)
    		{
    			scanf("%d",&t);
    			gcd = GCD(a,t);
    			a = a / gcd * t;       //先除去公约数
    		}
    		printf("%d
    ",a);
    	}
    }
    最后改进下求公约数的方法
    #include<stdio.h>
    
    int GCD(long n,long m)             //求最大公约数
    {
    	int i;
    	if(n <m)
    	{
    		int t = n;
    		n = m;
    		m = t;
    	}
    	if(n % m == 0)
    		return m;
    	else
    		return GCD(m,n%m);
    }
    int main(void)
    {
    	int a,t,gcd;
    	int n;
    
    	while(scanf("%d",&n)!=EOF)
    	{
    		a = 1;
    		while(n --)
    		{
    			scanf("%d",&t);
    			gcd = GCD(a,t);
    			a = a / gcd * t;
    		}
    		printf("%d
    ",a);
    	}
    }
    小结:出现错误,但肯定思路是对的,多从一些细节方面考虑。


  • 相关阅读:
    Java线程的几种状态
    常用几种Java Web容器
    数据库触发器
    SQL优化及注意事项
    Oracle中rownum和rowid的区别
    数据库及SQL优化
    如何安装使用Impala
    Impala:新一代开源大数据分析引擎
    开源大数据查询分析引擎
    Google Dremel 原理
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7073812.html
Copyright © 2011-2022 走看看