【9404】最大公约数

Time Limit: 10 second
Memory Limit: 2 MB

问题描述
用递归方法求两个正整数m和n的最大公约数。(m>0,n>0)

Input

两个数,即m和n的值。

Output

最大公约数

Sample Input

8 6

Sample Output

gcd=2

【题解】

用辗转相除法来做就好

假设k是两个数a,b的最大公约数

a = k*x1 b = k*x2;

k*x1 / k*x2 = x3 + rest

k*(x1) = k*x2*x3 + rest

要使得(k*x2*x3+rest)能被k整除,则 rest也应该能被k整除。

则rest = x4*k;

则可以转换成求b和x4*k的最大公约数。

最后若是余数为0,则说明 k*x2就是最大公约数。

【代码】

#include <cstdio>

int m,n;

void input_data()
{
    scanf("%d%d",&m,&n);
}

int gcd(int a,int b) //用递归的写法来写辗转相除法
{
    if ( b == 0)
        return a;
            else
                return gcd(b,a % b);
}

int main()
{
    input_data();
    printf("gcd=%d",gcd(n,m));
    return 0;
}


 

原文地址:https://www.cnblogs.com/AWCXV/p/7632417.html