HDU1713 最小周期

题目描述

给定两个分数,求其最小公倍数。用最简分数表示(整数就输出整数)。


输入

2

26501/6335 18468/42

29359/11479 15725/19170

输出

81570078/7

5431415


思路 求两个分数的最小公倍数,应先把两个分式化成最简形式,然后对两分子取最小公倍数作分子,对两分母取最大公因数作分母,这样的分数就是两个分数的最小公倍数。其中用到著名的辗转相除法,也叫欧几里得算法 求最大公因数gcd,最小公倍数lcm也可以用其相应表示。

/*
求两个分式的最小公倍数,先将两个分式化到最简,
然后两个分子的最小公倍数作分子,两个分母的最大公约数作分母
,即为两分式的最小公倍数
*/
#include <cstdio>
int gcd(int a, int b) //辗转相除法求最大公约数
{
	return b==0 ? a:gcd(b,a%b);
}
int lcm(int a, int b) 
{
	return a/gcd(a,b)*b;//最小公倍数即为a*b/gcd(a,b) 为了避免爆int,先除后乘
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--){
		int x1,x2,y1,y2;
		scanf("%d/%d %d/%d",&x1,&y1,&x2,&y2);
		//x1/y1 x2/y2化到最简
		int t = gcd(x1,y1);
		x1 /= t;
		y1 /= t;
		t = gcd(x2,y2);
		x2 /= t;
		y2 /= t;
		
		if(gcd(y1,y2) == 1) printf("%d\n",lcm(x1,x2));//若是整数输出整数
		else printf("%d/%d\n",lcm(x1,x2),gcd(y1,y2));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值