利用辗转相除法求最大公因数原理

引例

当输入两个数值m,n时,最大公因数最大也会与俩个数中最小的值相同此时m%n==0,

但一般情况m%n!=0,此时需要以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数

就比如312 与 16

312/16=19......8 余数一定小于除数

615 / 152 = 4.......7

152 / 7 = 21(余5)

7 / 5 = 1 (余2)

5 / 2 = 2 (余1)

2 / 1 = 2 (余0)

原理

A=B*q+R

A为被除数,B为除数,R为余数

A与B的公因数都会是B与R的公因数,即(A,B)=(B,R)

证明:

充分性

设 A,B (A<B)最大公因数为u,所以

A = a * u ,B = b *u

R = A - B* q = (a-b*q)u 因为a,b,q 都为整数所以修改为:

R = n * u 

所以如果u 是R 的公因数,那么也会是A B 的公因数

必要性

假设B 和R 存在一个公因数 v,则就会有

B = b` * v       R  = n` * v 

由 A=B*q+R 那么最后也会得到  A = a` * v

所以 B和R的任意公因数v都会是A的公因数

那么就有(A,B)(B,R)他们的 公因数完全一样,所以他们的最大公因数也相同

代码实现

/*
欧几里德算法:辗转求余
原理: gcd(a,b)=gcd(b,a mod b)
当b为0时,两数的最大公约数即为a
getchar()会接受前一个scanf的回车符
*/
#include<stdio.h>
int Gcd(int M,int N)
{
    int Rem;
    while(N > 0)
    {
        Rem = M % N;
        M = N;
        N = Rem;
    }
    return M; 
}
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("the greatest common factor of %d and %d is ",a,b);
    printf("%d\n",Gcd(a,b));
    return 0;
}

 

 

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读