NOIP 2001普及组 最小公倍数和最大公约数问题 详解

来源:互联网 发布:淘宝怎么推广和宣传 编辑:程序博客网 时间:2024/05/16 00:34

这道题一看上去就是一道十分简单的枚举搜索题,本来还以为要做些精巧操作才能过,后来发现直接暴力枚举就行了,原码如下:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;bool gcd(int a,int b,int divider)//判断最大公约数{    int tmp=min(a,b);    for (int i=tmp;i>divider;i--){        if (a%i==0 && b%i==0){//说明有比x更大的公约数,不成立             return false;        }    }    if (a%divider==0 && b%divider==0){        return true;    }else{        return false;    }}bool lcm(int a,int b,int multiple)//判断最小公倍数 {    int tmp=max(a,b);    for (int i=tmp;i<multiple;i++){        if (i%a==0 && i%b==0){//说明有比y更小的公倍数,不成立             return false;        }    }    if (multiple%a==0 && multiple%b==0){        return true;    }else{        return false;    }}int main(){    int x,y,ans=0;    cin>>x>>y;    /*若x,y为最大公约数和最小公倍数,则p,q两数至少为x,至多为y,      所以>=x,<=y,且它们都,是x的倍数,所以每次都+=x,这样的小剪枝      很重要,否则过不了    */     for (int p=x;p<=y;p+=x){        for (int q=x;q<=y;q+=x){            if (gcd(p,q,x) && lcm(p,q,y)){                ans++;            }        }    }    cout<<ans<<endl;}
原创粉丝点击