关于求最大公约数和最小公倍数

最大公约数gcd

辗转相除法

《关于求最大公约数和最小公倍数》

int gcd(int x, int y)
{ 	
	int z = y;
	while(x%y!=0)
	{ 
		z = x%y;
		x = y;
		y = z;	
	}
	return z;
}

穷举法

int gcd(int x,int y)
{ 
   	int temp = 0;
    for(temp = x ; ; temp-- )
    { 
		if(x%temp == 0 && y%temp==0) 
	   		break; 
   	}
	return temp;
}

调用algorithm

int gcd=_gcd(x,y);

最小公倍数lcm

其实很简单只需要两个数的乘积除以最大公约数就行

//可以记一个推论:欲求 a与b的最小公倍数lcm,已知	a与b的最大公约数为gcd		
//则            lcm=a/gcd*b   

例题

《关于求最大公约数和最小公倍数》

思路

其实挺简单,就是求两个分数的最小公倍数,然后再相加就行了。

源码

#include<stdio.h>
typedef long long ll;//给 long long 起了个别名 与 #define ll long long 效果相似 

//(1)使用欧几里得算法(即辗转相除法)设计一个求最大公约数的函数.
// 递归式:gcd(a,b)=gcd(b,a%b)
// 递归边界:gcd(a,0)=a (0和任何一个整数a的最大公约数都是a) 
int gcd(int a,int b)
{ 
	if(a==0)
	return 0;
	else
	return (b==0)?a:gcd(b,a%b);
}
//(2)写主函数
int main()
{ 
	int n;
	ll a,b,c,d,lcm;  //根据题目要求定义变量类型, lcm代表最小公倍数 
	int i=1;
	scanf("%d",&n);
	scanf("%lld/%lld",&a,&b);  //输入第一个分数
	int t=gcd(a,b);            //求分子分母的最大公约数
	if(t)           
	{ 
		a/=t;                  //化简
		b/=t;
	}
	while(i<n)                 //循环输入其它分数
	{ 
		scanf("%lld/%lld",&c,&d);
		lcm=b/gcd(b,d)*d;   //!!!此处有一个重要的技巧点!!!
					//最小公倍数的求解在最大公约数的基础上进行
					//可以记一个推论:欲求 a与b的最小公倍数lcm,已知 a与b的最大公约数为gcd 
					//则 lcm=a/gcd*b 
		
		a=a*lcm/b+c*lcm/d;  //此处是两个分数合并化简的步骤
  		b=lcm;              //应好好体会该算法的意义
		int t=gcd(a,b);      
		if(t)               //继续化简
		{ 
			a/=t;
			b/=t;
		}
		i++;
	}
	//(3)最后的三种情况下的结果
	if(a&&(a/b==0))        // 结果为真分数时 
    	printf("%lld/%lld",a%b,b);
    else if(a%b==0)        // 结果为整数时 
    	printf("%lld",a/b);
    else                   // 结果为假分数时
    	printf("%lld %lld/%lld",a/b,a%b,b);
    return 0;
}
    原文作者:ღ江晚吟
    原文地址: https://blog.csdn.net/m0_46549425/article/details/112756277
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞