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

    题目描述 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


     方法1:枚举

    要点:两个数的乘积等于二者最大公约数和最小公倍数的乘积。

    #include<iostream>
    #include<stdio.h>
    #include<math.h>
    using namespace std;
    
    int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
    
    int main(){
        int x,y,v,k,m=0,i;
        scanf("%d%d",&x,&y);
        v=x*y;
        k=sqrt(v);
        for(i=x;i<=k;++i)
            if(v%i==0&&gcd(v/i,i)==x)++m;
        printf("%d",m*2);
        return 0;
    }
    View Code

    方法2:分解质因数(最优)

    要点:两个数的乘积等于二者最大公约数和最小公倍数的乘积。

    思路:题目要求最大公约数(gcd)为3,最小公倍数(lcm)为60的两个数p、q的组数,两个数都去掉gcd后,即样例中的3、60变为1、20。这样即可变为求gcd为1,lcm为20的两个数p、q的组数,即找两个互质的数,他们的乘积为20。那么可以对20进行质因数分解,得:2、2、5。盯住其中一个数,从质因数中选择。由于两个数要求互质,所以相同的质因数要合并,得到:4、5。选法有2^2=4种:1,4,5,20。对应的四组答案即:1-20,4-5,5-4,20-1。乘以gcd得到原来题目答案:3-60,12-15,15-12,60-3。

    #include<iostream>
    #include<stdio.h>
    #include<math.h>
    using namespace std;
    
    int main(){
        int x,y,z,k=0,i;//k为不同质因数的个数
        scanf("%d%d",&x,&y);
        if(y%x!=0)printf("%d
    ",0);
        else{
            z=y/x;//除以最大公约数x
            //质因数分解
            for(i=2;i<=z;++i){
                if(z%i==0){
                    ++k;
                    while(z%i==0)z=z/i;//合并相同的质因数
                }
            }
            printf("%d
    ",int(pow(2,k)));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    java中JVM的原理重温【转】
    JavaBean 规范
    Java编程规范[转]
    spring mvc 多数据源切换,不支持事务控制[一]
    03-连连看-连通分析
    02-连连看-用例分析
    01参考资料
    03-稀疏矩阵
    02-对不重复的一组数据查找
    01-用链式结构打印学生成绩单
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4717983.html
Copyright © 2011-2022 走看看