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 }
  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/Kiven5197/p/5655917.html
Copyright © 2011-2022 走看看