P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

题目描述

输入两个正整数 x,y,求出满足下列条件的 P,Q 的个数:

  1. P,Q 是正整数。

  2. 要求 P,Q 以  x 为最大公约数,以 y 为最小公倍数。

试求:满足条件的所有可能的 P,Q 的个数。

输入格式

一行两个正整数 x,y。

输出格式

一行一个数,表示求出满足条件的 P,Q 的个数。

输入输出样例

输入

3 60

输出 

4

思路

  1. 两个数的乘积就等于它们最大公约数与最小公倍数的乘积,所以 P * Q = x * y = 定值。
  2. 并且 P 和 Q 都为最大公约数 x 的倍数,假设 P 从 x 的倍数开始增加,通过P * Q = x * y = 定值 求出 Q 的值
  3. 求出此时的 P 和 Q 的最小公倍数,如果它们最小公倍数等于 x,就说明符合条件,就可以记录下来
  4. 值得注意的是,P , Q 是正整数,所以当定值(x * y)% P!=0时就说明 Q 不是整数,这种情况需要直接跳过

代码 

 

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int temp1=a;  //P 从最小公倍数开始
        int temp2;    //定义 Q
        int count=1;  //倍数的叠加
        int res=0;  //记录满足条件的个数
        while (temp1<=b){  //P 应该小于最大公约数
            temp1=a*count; //让 P 开始以倍数形式递增
            if ((a*b)%temp1!=0){  //说明此时的 P得出的 Q 不是整数
                count++;          //跳过这次判断
                continue;
            }
            temp2=a*b/temp1;  //得出 Q
            int f = f(temp1, temp2);  //得出他们的最小公倍数
            if (f==a){
                res++;
            }
            count++;
        }
        System.out.println(res);
    }
    public static int f(int a,int b){  //利用更相减损法求最大公约数
        while (a!=b){
            if (a>b){
                a=a-b;
            }else {
                b=b-a;
            }
        }
        return a;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值