最大公约数与最小公倍数问题

原创 2006年06月22日 18:02:00

[问题描述]
输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P、Q的个数。
条件:1、P、Q是正整数
2、要求P、Q以xO为最大公约数,以yO为最小公倍数。
试求,满足条件的所有可能的两个正整数的个数。
[样例]
输入:x0=3 y0=60
输出:4
说明:(不用输出)此时的 P Q 分别为,
3 60
15 12
12 15
60 3
所以,满足条件的所有可能的两个正整数的个数共4种。

知识准备:

 p,q的最大公约数为x0,则:

 p%x0=0,q%x0=0

假设 p1=p/x0   q1=q/x0

进行如下推导:

1。如果p1=q1,则根据最大公约数的定义,p1=q1=1,p=q=x0,根据最小公倍数的定义,p=q=y0,   x0=y0=p=q

2.如果p1!=q1,根据最大公约数的定义,p1q1除了1以外没有其他相同的因子,即p1,q1互质。

3.根据最小公倍数的定义,y0=pq/x0, p1=p/x0,q1=q/x0,则可推出如下的等式:p1q1=y0/x0.

  根据以上分析,可以推出以下算法:

 

   1。如果y0%x0!=0,p,q不存在。

   2。如果y0=x0,则存在一组p,q,p=q=x0=y0

   3. 1y0/x0之间查找满足p1q1=y0/x0p1,q1互质的数据对。

 

参考程序如下:

#include<iostream>

#include<cstdio>

using namespace std;

long x,y,p,q,i,s;

int hz(long p,long q)//判断p,q互质

{

    long j;

    for(j=2;j<=p;j++)

    if(p%j==0&&q%j==0)

       return 0;

    return 1;  

   

}    

int main()

 {  

     freopen("in.txt","r",stdin);

     freopen("out.txt","w",stdout);

     while(cin>>x>>y)

     {

         if(y%x!=0)

           cout<<0<<endl;

         else if(y==x)cout<<1<<endl;

         else

            {

                s=0;

                i=y/x;

                for(p=1;p<=i;p++)

                 for(q=1;q<=i;q++)

                  if((p*q==y/x)&&hz(p,q))

                    s++;

             cout<<s<<endl;  

            }     

     }   

     return 0;

 }   

 

二。对算法的改进

1.猜想

   根据前面的分析:如果p,q的最大公约数为x,最小公倍数为y,则只要查找满足乘积为y/x且互质的p1,q1数据对就可以了。这样的数据对个数有没有规律呢?

猜想:设y0/x0的质因子个数为k,则满足条件的p,q对个数为2^k,即集合中子集合的数目。

证明:

假设y0/x0k个质因子,y0/x0=a1*a1*…ak (ai是质数,算术基本定理)

要使得p1*q1=y0/x0,p1,q1互质,则p1,q1不能含有相同的的质因子,因此p1,q1的选择总数为

如何统计整数s的质因子个数k?最简单的方法是线性查找。2开始依次累加,第一个能整除s的数据必然为质因子,通过循环整除操作排除该质因子后,下一个能整除s的数据还是质因子。

算法如下:

1. i=2;

2. While (s%i!=0) s++;

3. K++;

4. While (s%i==0)  s=s/i;

5. 继续执行语句2

参考程序如下:

#include<iostream>
#include<cstdio>
using namespace std;
long x,y,p,q,i,s,j,k;
long total;//保存2^k  
int main()
 {  
     freopen("in.txt","r",stdin);
     freopen("out.txt","w",stdout);
     while(cin>>x>>y)
     {
         if(y%x!=0)
           cout<<0<<endl;
         else if(y==x)cout<<1<<endl;
         else
            {
                s=0;
                i=y/x;
                j=2;
                while(i>1)
              { 
                while(i%j!=0)  j++;
                s++;
                while(i%j==0) i=i/j;
              }   
                total=1;
                for(j=1;j<=s;j++)
                 total*=2;  //计算2^k 
             cout<<total<<endl;  
            }     
     }   
     return 0;
 }   

最大公约数与最小公倍数

最大公约数与最小公倍数          古希腊数学家欧几里德提出了求两个自然数的最大公约数的方法——辗转相除法,又称为欧几里德算法。     我们一般用(x1, x2, …, xn)表示n个正整数x...
  • ZLambert
  • ZLambert
  • 2017年03月24日 23:06
  • 212

求最大公约数与最小公倍数

1.最大公约数: 1.1辗转相除法(推荐) 用两个数中的大数除以小数,若整除则小数即为俩数最大公约数,否则需要将大数除以小数的余数作为除数,两个数中较小数作为新的除数,进行新一轮的除法判断,直到除数整...
  • qq_34767784
  • qq_34767784
  • 2017年03月20日 20:37
  • 149

wikioi1012 最大公约数和最小公倍数问题(2001年NOIP全国联赛普及组)

题目描述 Description 输入二个正整数x0,y0(2 条件:  1.P,Q是正整数 2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所...
  • kingzone_2008
  • kingzone_2008
  • 2013年09月24日 15:56
  • 4320

[noip2001普及(初中)组] 第二题《最大公约数和最小公倍数问题》解题报告

题目描述Description 输入二个正整数x0,y0(2 条件:  1.P,Q是正整数 2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所有可能的两个正整数的个数. ...
  • zhaosdfa
  • zhaosdfa
  • 2014年08月26日 21:28
  • 813

常见算法:C语言求最小公倍数和最大公约数三种算法

最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 ...
  • iwm_NeXT
  • iwm_NeXT
  • 2012年04月11日 17:22
  • 343355

【C/C++】求最大公约数的三种方法

一、最大公约数与最小公倍数 最大公约数,属于数论所探究的内容。 最大公约数可以通过下面的三种方法求出来。 最小公倍数呢,它与最大公约数的乘机为所求数之积。   比如求  x,y的最大公约数和最小公倍数...
  • qq_31828515
  • qq_31828515
  • 2016年07月02日 20:48
  • 29134

java算法——求最大公约数和最小公倍数

//求最大公约数和最小公倍数 /*求最大公约数方法:辗转相除法 始终用较大数除以较小数,然后用余数代替较大数 整除时的除数就是最大公约数 举例:222 407求最大公约数 222 407(407除...
  • tingzhiyi
  • tingzhiyi
  • 2016年07月28日 20:26
  • 6091

最大公约数与最小公倍数问题

[问题描述]输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P、Q的个数。条件:1、P、Q是正整数2、要求P、Q以xO为最大公约数,以yO为最小公倍数。...
  • fisher_jiang
  • fisher_jiang
  • 2006年06月22日 18:02
  • 3956

如何快速求最大公约数和最小公倍数

可以运用辗转相除法, 即:(326,78)=(78,326%78);         (78,14)  =(14,78%14);         (14 ,,8 ) =(8,14%8);       ...
  • Little1Pudding
  • Little1Pudding
  • 2017年04月24日 11:46
  • 337

noip2001 最大公约数和最小公倍数问题 (质因数分解)

A1131. 最大公约数和最小公倍数问题 时间限制:1.0s   内存限制:256.0MB   总提交次数:1023   AC次数:381   平均分:63.15 将本题分享...
  • yuyanggo
  • yuyanggo
  • 2015年08月24日 19:21
  • 710
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大公约数与最小公倍数问题
举报原因:
原因补充:

(最多只允许输入30个字)