C语言 扩展欧几里得算法代码

 更新时间:2013年09月01日 15:03:01   作者:  
这篇文章介绍了扩展欧几里得算法的实现代码,有需要的朋友可以参考一下

给定两个正整数m和n,我们计算它们的最大公因子d和两个整数a和b,使得a*m+b*n=d

算法流程
  E1.置a'=b=1;a=b'=0;c=m,d=n;

  E2.计算d和r,使得c=q*d+r;

  E3.若r==0;则退出,当前已有a*m+b*n=d;

  E4;c=d;d=r;t=a';a'=a;a=t-q*a;t=b';b'=b;b=t-q*b;返回E2.

证明

  对于已有的m和n,假设m>n;如果刨除变量a,b,a',b';算法与欧几里得算法完全一样,为计算最大公约数的算法.

  最终要求的为a*m+b*n=d=GCD(m,n);如果改式子成立由欧几里得算法可推出a'*n+b'*(m%n)=GCD(n,m%n);

  因为GCD(m,n)=GCD(n,m%n);

  所以a*m+b*n=a'*n+b'*(m%n)

        =a'*n+b'*(m-(m/n)*n)

        =a'*n+b'*m-b'*(m/n)*n

        =b'*m+(a'-b'*(m/n))*n

  所以a=b';b=a'-b'*(m/n);

  可以推出根据a‘、b'可以计算a、b。

代码实现

复制代码 代码如下:

void EGCD(int m,int n)
{
    int a,a1,b,b1,c,d,q,r,t;
    a1=b=1,a=b1=0,c=m,d=n;
    while(1)
    {
        q=c/d,r=c%d;
        if(r==0)
        {
            printf("(%d)*%d+(%d)*%d=%d\n",a,m,b,n,d);
            return;
        }
        c=d,d=r,t=a1,a1=a,a=t-q*a,t=b1,b1=b,b=t-q*b;
    }
}

相关文章

  • strcat函数与strncat函数的深入分析

    strcat函数与strncat函数的深入分析

    本篇文章是对strcat函数与strncat函数进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Qt处理焦点事件(获得焦点,失去焦点)

    Qt处理焦点事件(获得焦点,失去焦点)

    本文主要介绍了Qt处理焦点事件(获得焦点,失去焦点),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • C语言二分查找算法及实现代码

    C语言二分查找算法及实现代码

    本文主要介绍C语言的二分查找算法,这里给大家详细介绍了什么是二分查找,并提供代码实例,需要的小伙伴可以参考下
    2016-07-07
  • c/c++拷贝构造函数和关键字explicit详解

    c/c++拷贝构造函数和关键字explicit详解

    这篇文章主要介绍了c/c++拷贝构造函数和关键字explicit的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • C/C++实现磁盘相关操作的示例代码

    C/C++实现磁盘相关操作的示例代码

    这篇文章主要为大家详细介绍了C/C++如何实现磁盘相关操作,例如遍历磁盘容量、实现磁盘格式化、移除指定磁盘等,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • opencv实现多张图像拼接

    opencv实现多张图像拼接

    这篇文章主要为大家详细介绍了opencv实现多张图像拼接功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 浅谈十进制小数和二进制小数之间的转换

    浅谈十进制小数和二进制小数之间的转换

    下面小编就为大家带来一篇浅谈十进制小数和二进制小数之间的转换。小编觉得挺不错的现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C语言实现简单的扫雷游戏操作

    C语言实现简单的扫雷游戏操作

    这篇文章主要为大家详细介绍了C语言实现简单的扫雷游戏操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • C++实现LeetCode(108.将有序数组转为二叉搜索树)

    C++实现LeetCode(108.将有序数组转为二叉搜索树)

    这篇文章主要介绍了C++实现LeetCode(108.将有序数组转为二叉搜索树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实例之双向链表增删改查

    C语言实例之双向链表增删改查

    双向链表(Doubly Linked List)是一种常见的数据结构,在单链表的基础上增加了向前遍历的功能,与单向链表不同,双向链表的每个节点除了包含指向下一个节点的指针外,还包含指向前一个节点的指针,本文给大家介绍了C语言中双向链表的增删改查
    2023-08-08

最新评论