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 }
  • 相关阅读:
    SVN:cannot map the project with svn provider解决办法
    项目管理工具_maven的配置
    servlet,过滤器,监听器,拦截器的区别
    索引
    事务的隔离级别和传播行为
    jbpm工作流
    Hibernate---进度1
    java——反射
    HttpClient
    TCP和UDP并实现socket的简单通信
  • 原文地址:https://www.cnblogs.com/Kiven5197/p/5655917.html
Copyright © 2011-2022 走看看