zoukankan      html  css  js  c++  java
  • 最大公约数和最小公倍数问题

    题目描述

    输入2个正整数x0,y0(2x0<100000,2y0<=1000000),求出满足下列条件的P,Q的个数

    条件:

    1. P,Q是正整数

    2. 要求P,Qx0为最大公约数,以y0为最小公倍数.

    试求:满足条件的所有可能的2个正整数的个数.

    输入输出格式

    输入格式:

    2个正整数x0,y0

    输出格式:

    1个数,表示求出满足条件的P,Q的个数

    输入输出样例

    输入样例#1: 复制
    3 60
    
    输出样例#1: 复制
    4
    

    说明

    P,QP,Q有4种

    1、3,60
    2、15,12
    3、12,15
    4、60,3

    关于这道题,首先要明确一件事:两个正整数的乘积是最大公约数乘以最小公倍数(在这里进行一个并不严谨的证明):

    定义两个正整数PQ,他们的最大公约数是x,最小公倍数是y。y就是x*(P/x)*(Q/X),那么再乘一个x,不久等于P*Q吗?

    所以,这道题的求解范围就大大地缩小了,我们只需要枚举x的倍数即可,并令相乘等于x*y即可。

    但是还是有一个问题:比如样例3 60 按照上述的方法求得10 6是满足条件的解,但是实际上他们的最大公约数是2,所以我们还需要判断最大公约数是否与给出的相等(利用辗转相除法),由于两个数乘积一定,如果最大公约数一定,那么显然最小公倍数一定,所以这是显然成立的。

    最后,附上本题代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int ans;
     5 int gcd(int x,int y)
     6 {
     7     if(x%y==0)
     8     {
     9         return y;
    10     }
    11     else
    12     {
    13         return gcd(y,x%y);
    14     }
    15 }
    16 int main()
    17 {
    18     int x,y;
    19     scanf("%d%d",&x,&y);
    20     for(int i=x;i<=x*y;i+=x)
    21     {
    22         if((x*y)%i==0&&gcd(i,(x*y)/i)==x)
    23         {
    24             ans++;
    25         }
    26     }
    27     printf("%d",ans);
    28     return 0;
    29 }
  • 相关阅读:
    【Android平台安全方案】の #00-请不要在外部存储(SD卡)加密存储的敏感信息
    本学习笔记TCP/IP传输协议
    iOS_23_undress Girl
    uva 1560
    IOS开发-Swift新语言初见
    39个让你受益的HTML5教程
    ubuntu12.04管理员账户登录不了桌面,仅仅能客人会话登录
    怎样使用SetTimer MFC 够具体
    ArcGIS API for Silverlight 编辑Geometry
    几种更新(Update语句)查询的方法
  • 原文地址:https://www.cnblogs.com/yufenglin/p/10308948.html
Copyright © 2011-2022 走看看