关闭

求最大公约数

370人阅读 评论(0) 收藏 举报
分类:

                                                         求最大公约数

                     很多时候我们都需要使用这个进行解决问题, 所以认为写一个和最大公约数有关的东西是必要的!

                    思想:

                             采用辗转相除法:

                            关于辗转相除法, 搜了一下, 在我国古代的《九章算术》中就有记载,现摘录如下: 


约分术曰:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。” 


其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法,实际上就是辗转相除法。 


辗转相除法求最大公约数,是一种比较好的方法,比较快。 

          其实很简单 ,就是一个数对另一个数求余,然后把余数作为除数, 原除数作为被除数, 直至 余数为0  那么除数就是 最大公约数 ( 要判断除数为 0 ) 的情况就是!

          不多说了 ,直接上代码:

 源代码:

#include<cstdio>
#include<iostream>
using namespace std;

int oulid(int a, int b)
{
    int t;
    if(b == 0)
    {
        return a;
    }
    t = a%b;
    while(t  != 0)
    {
        a = b;
        b = t;
        t = a%b;
    }
    return b;
}
int main()
{
    int a, b, c;
    cout<<"Input two integers"<<endl;
    while(cin>>a>>b)
    {
         c = oulid(a, b);
         cout<<c<<endl;
    }
    return 0;

}


下面给出求最大公约数的递归和飞抵会代码,并且给出 注释:

#include<iostream>
using namespace std;

int oulid(int a, int b)
{
    //求最大公约数
    if(b == 0)
    {
        return a;
    }
    int res = a%b ;  //表示余数 6 4  余数 2  er 4 7 res 4
    while(res)
    {
        a = b;     // a= 4   2   er  7 4 3
        b = res;   //b = 2   2  er 4   3 1 就是最大公约数
        res = a%b; //res = 2  0  er 3  1 0
    }
    return b;
}
int gcd(int a, int b)
{
    if(b == 0) return a;
    return gcd(b , a%b);
}
int main()
{
    int a, b;
    while(cin>>a>>b)
    {
        int ans1 = oulid(a, b);
        int ans2 = gcd(a, b);
        cout<<ans1<<" "<<ans2<<endl;
    }
    return 0;
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:156843次
    • 积分:4550
    • 等级:
    • 排名:第6726名
    • 原创:312篇
    • 转载:13篇
    • 译文:0篇
    • 评论:16条
    感谢打赏 支付宝二维码
    支付宝
    微信二维码 欢迎打赏
    微信
    最新评论