0
点赞
收藏
分享

微信扫一扫

C语言扩展欧几里得算法含测试效果

Hyggelook 2022-01-16 阅读 45

本博文源于胡凡老师的《算法笔记》,当计算gcd(a,b)时,有 a x 1 + b y 1 = g c d a{x_1}+by_1=gcd ax1+by1=gcd成立,而在下一步计算gcd(b,a%b)时,又有 b x 2 + ( a % b ) y 2 = g c d bx_2+(a\%b)y2=gcd bx2+(a%b)y2=gcd成立,因此 a x 1 + b y 1 = b x 2 + ( a % b ) y 2 ax_1+by_1=bx_2+(a\%b)y_2 ax1+by1=bx2+(a%b)y2成立,又考虑到有关系 a % b = a − ( a / b ) ∗ b a\%b=a-(a/b)*b a%b=a(a/b)b(此处除法为整除),因此 x 1 + b y 1 = b x 2 + ( a − ( a / b ) ∗ b ) y 2 x_1+by_1=bx_2+(a-(a/b)*b)y_2 x1+by1=bx2+(a(a/b)b)y2成立,将等号右边的式子整理后可得 a x 1 + b y 1 = b ( x 2 − ( a / b ) ∗ b ) y 2 ax_1+by_1=b(x_2-(a/b)*b)y_2 ax1+by1=b(x2(a/b)b)y2

完整源码

#include<iostream>
using namespace std;
int exGcd(int a, int b, int &x, int &y) {
    //x和y使用引用
    if(b==0){
        x=1;
        y = 0;
        return a;
    }
    int g = exGcd(b,a%b,x,y);//递归计算exgcd(b,a%b);
    int temp = x; //存放x的值
    x = y; //更新x=y(old)
    y = temp -a/b*y;//更新y=x(old)-a/b*y(old)
    return g;
}


int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    int x=0,y=0;
    printf("%d*%d+%d*%d=%d",a,x,b,y,exGcd(a,b,x,y));
    return 0;
}


测试效果

在这里插入图片描述

举报

相关推荐

0 条评论