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

    题目描述 Description

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

    条件:  1.P,Q是正整数

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

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

    输入描述 Input Description

    二个正整数x0,y0

    输出描述 Output Description

    满足条件的所有可能的两个正整数的个数

    样例输入 Sample Input

    3 60

    样例输出 Sample Output

    4

    首先我们要知道两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积

    证明如下:

    假设两个数为 a和b,他们的最大公约数是a/c,
    那么他们的最小公倍数为 (a/c) * a/(a/c) * b/(a/c)
    化简后得 b*c
    所以 最大公约数 乘以 最小公倍数 = (a/c) * (b*c) =a*b
    所以两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积
     
    附AC代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 int main(){
     8     int x,y,num,ans=0,a,n,m,r;
     9     cin>>x>>y;
    10     num=x*y;//num即为两数乘积 
    11     for(int i=x;i*i<num;i+=x){//可以证明当i*i<num,出现的满足条件数字组合是i*i<m中满足条件的数字组合的相反组合,
    12     //i*i=num肯定的是不满足的。i一定要是最大公因数的x倍,所以直接+=x 
    13         if(num%i==0){//保证num/i是一个整数
    14             a=num/i;//另一个数 
    15             if(a%x==0){//保证a可以除尽最大公因数
    16                 n=i/x;
    17                 a=a/x;
    18                 r=n%a;
    19                 while(r!=0){
    20                     r=n%a;
    21                     n=a;
    22                     a=r;
    23                 }//判断同时除以n后两数是否还有其他公因数
    24                 if(n==1||i/x==1)//互质 
    25                 ans+=2;//因为是正反两种所以直接加二 
    26             }
    27             
    28         }
    29     }
    30     cout<<ans<<endl;
    31     return 0;
    32 }
  • 相关阅读:
    C# WebApi 获取客户端ip地址
    C# 构造函数快捷键
    2 .SHELL 5~10节
    Spring项目集成apidoc生成api接口文档
    根据域名查找对应的ip及端口
    高质量SQL的30条建议
    1 .shell编程1~5
    CentOS7安装mysql8
    编译安Apache2.4.43报错checking for APR... no configure: error: APR not found. Please read the documentation.
    rm -rf * 的正确用法
  • 原文地址:https://www.cnblogs.com/Kiven5197/p/5655917.html
Copyright © 2011-2022 走看看