欧几里德算法及拓展
发布日期:2021-06-29 11:13:48 浏览次数:2 分类:技术文章

本文共 634 字,大约阅读时间需要 2 分钟。

1、欧几里德算法(辗转相除)求两个数的最大公约数

例如:求a, b的最大公约数即gcd(a, b) 当b != 0时, b = a%b, a = b,继续gcd(a, b) 当b == 0时,此时的a就是a,b的最大公约数
代码递归实现:
int gcd(int a, int b) {  return b ? gcd(b, a%b) : a;}
代码循环实现:
int gcd(int a, int b) {  int temp;  while (b) {    temp = a;        a = b;    b = temp%b;  }  return a;}

2、欧几里德的拓展

我们知道,在数学中,对于任意两个正整数a和b,必定存在一对整数s、t使得sa+tb = gcd(a,b)void exgcd(int a, int b, int * s, int * t) {  if (b == 0) {    *s = 1, *t = 0;  }else {    int next_s, next_t;    exgcd(b, a%b, &next_s, &next_t);    *s = next_t, *t = next_s - a/b * next_t;  }}
当b == 0时可取s = 1, t = 0; 当b != 0时s = next_t, s = next_s - a/b * next_t(即s,t与下一层的s, t存在的关系);
 

转载地址:https://blog.csdn.net/ZWHSOUL/article/details/79217074 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:CSDN-markdown编辑器基本用法
下一篇:C语言中的goto语句

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年05月01日 05时11分34秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章