7.10 枚举——最大公约数和最小公倍数问题

今天讲解一道数学中常见的最大公约数与最小公倍数问题,靠编程来实现。

题目描述

输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数。
条件:
1. P,A是正整数;
2. 要求P,Q以x0为最大公约数,以y0为最小公倍数。
试求:
满足条件的所有可能的两个正整数的个数。 

输入

每个测试文件只包含一组测试数据,每组两个正整数x0和y0(2<=x0<100000,2<=y0<=1000000)。

输出

对于每组输入数据,输出满足条件的所有可能的两个正整数的个数。
下面是对样例数据的说明:
输入3 60
此时的P Q分别为:
    3     60
    15   12
    12   15
    60   3
所以,满足条件的所有可能的两个正整数的个数共4种。

样例输入 Copy

3 60

样例输出 Copy

4
题解代码:
#include<iostream>
using namespace std;
int x0,y0;
//求最大公约数
int gcd(int x,int y){
    if(y==0) return x;
    else return gcd(y,x%y);
}
//求最小公倍数
int gbd(int x,int y){
    int q=gcd(x,y);
    int x1=x/q;
     
    return y*x1;
}
int main(){
    scanf("%d%d",&x0,&y0);
    int num=1;
    int a[100001];
    int i;
    for(i=1;;i++){
        num=i*x0;
        a[i-1]=num;
        if(num>y0) break;       
    }
    i--;
    int sum=0;
    for(int i1=0;i1<i;i1++){
        for(int i2=i1+1;i2<i;i2++){
             
            if(gcd(a[i1],a[i2])==x0&&gbd(a[i1],a[i2])==y0){
                sum++;
            }
        }
    }
    printf("%d",sum*2);
    return 0;
}
题解思路:
思路比较简单,
1.写出求最大公约数的函数gcd和求最小公倍数的函数gbd,设置int型变量sum=0,来计算对数.
2.再分析可知,每一对元素的值必定在[x0,y0]中,每一对元素必定为x0的倍数,枚举出x0到y0间x0的所有倍数,建立a[]数组。
3.枚举a[i]元素中的每一位,令它与它之后的每一个元素比较,看是否gcd(a[i],a[j])==x0且gbd(a[i],a[j])==y0,若成立,则sum++;
4.最终将sum*2输出,这套算法时间复杂度为n*logn
解析gcd函数与gbd函数
求最大公约数函数gcd利用递归,在纸上模拟一下便可求出。
最小公倍数函数gbd先求出两个参数x,y的最大公约数q,求出x/q得到的商x1,用y*x1即为所求的最大公约数
posted @ 2019-07-10 10:53  陈晓淞cxs  阅读(567)  评论(0编辑  收藏  举报