zoukankan      html  css  js  c++  java
  • 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即为所求的最大公约数
  • 相关阅读:
    day14(xml 编写及解析)
    day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)
    day13(反射,BeanUtils包)
    day10(IO流汇总)
    day08(File类 ,字节流)
    day08(异常处理,创建异常,finally,throws和throw的区别)
    [SPOJ-PT07J] Query on tree III (主席树)
    [ZJOI2008] 树的统计(树链剖分)
    长链剖分学习笔记
    [BZOJ4260] Codechef REBXOR (01字典树,异或前缀和)
  • 原文地址:https://www.cnblogs.com/cxs070998/p/11162449.html
Copyright © 2011-2022 走看看