poj2429

8 篇文章 0 订阅

题目链接:http://poj.org/problem?id=2429

题意:给出a,b两个数的最小公倍数和最大公约数,求出a,b,并且a+b最小

解题思路:这题我没有想出什么简便的方法,只能用枚举的方法。在枚举之前,必须要进行一些预处理。首先,我们要知道的是:

a*b=GCD(a,b)*LCM(a,b);

GCD(a,b)=G,

GCD(a/G,b/G)=1,

LCM(a/G,b/G)=a/G*b/G=a*b/(G*G)=LCM(a,b)/G;

所以,要想枚举求出a,b。我们只需要求出a/G,b/G。要想a+b最小,只要a,b最接近就可以了。那个从sqrt(LCM(a,b)/G),枚举就可以了。

import java.util.Scanner;
import java.math.*;

public class Main{
	public static void main(String[] args){
		Scanner cin = new Scanner(System.in);
		long a, b, x, y;
		while(cin.hasNext()){
			a = cin.nextLong();
			b = cin.nextLong();
			x = y = 0;
			b /= a;
			for(long i = (long)Math.sqrt(b); i > 0; i --){
				if(b%i == 0&&gcd(i, b/i) == 1){
					x = i*a; y = b/i*a; break;
				}
			}
			System.out.println(x+" "+y);
		}
	}
	public static long gcd(long a, long b){
		if(a<b){
			long t =a; a = b; b = t;
		}
		if(b == 0) return a;
		else return gcd(b, a%b);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值