本人是小学五年级学生,前不久刚学了最大公因数和最小公倍数,因此可以负责任地跟大家说:最大公因数最小公倍数=两数之积。用上述式子可以枚举P、Q中的一个数,另一个就用最小公倍数最大公因数/枚举到的数。而且由上述式子可知,P和Q的积就是x1和x2的积,范围是【min(x1,x2),max(xi,x2】。基本条件(a>=maxgys)&&(a<=mingbs)&&(b>=maxgys)&&(b<=mingbs)。

但是这还不够,我们还得判断P和Q的最小公倍数和最大公因数是不是x1和x2。数学老师教了一种神奇的方法,叫辗转相除法。下为辗转相除例子:

例:求25和85的最大公因数 85/25=3......10 25/10=2......5 10/5=2 当除到没有余数时,除数就是它们的最大公因数

可用C++函数实现:

int gys(int x,int y)
{
    int z=x%y;
    while(z>0)
    {
        x=y;
        y=z;
        z=x%y;
    }
    return y;
}

言归正传,满足这样的条件,这组数就符合条件,he++:(a>=maxgys)&&(a<=mingbs)&&(b>=maxgys)&&(b<=mingbs)&&(gysmax==maxgys)&&(a*b/gysmax==mingbs)

上代码!

#include<iostream>
#include<cstdio>
#include<algorithm>//防止万能头出错

using namespace std;
int gys(int x,int y)
{
    int z=x%y;
    while(z>0)
    {
        x=y;
        y=z;
        z=x%y;
    }
    return y;
}//辗转相除
int maxgys,mingbs,t,he,a,b,gysmax;
int main()
{
    cin>>maxgys>>mingbs;
    t=maxgys*mingbs;
    for(int i=1; i<=t; i++)
    {
        a=i;//数P
        b=t/i;//数Q
        gysmax=gys(a,b);
        if(t%i>0)continue;
        if((a>=maxgys)&&(a<=mingbs)&&(b>=maxgys)&&(b<=mingbs)&&(gysmax==maxgys)&&(a*b/gysmax==mingbs))he++;//判断条件,别忘了养成&&前后加括号的好习惯哦!
    }
    cout<<he;//输出

    return 0;
}//华华丽丽的结束
//备注,勿抄题解!!

Tips:在判断范围时要注意,不能用<和>,应该用<=和>=,否则会漏掉P、Q正好等于x1和x2的情况!

管理员,看在本蒟蒻打了这么久的份上,让我通过吧!小学生绿名不容易啊!