[每日练习]最大公约数问题的推倒

最大公约数问题

描述:对于给定正整数x,y,求它们的最大公约数d,并且求出参数a, b使得ax+by=d

辗转相除法

最大公约数的编程求解一般采用辗转相除法,具体如下:

1.取x,y中的较大者,这里假设x>y。

2.用x对y取模(即mod运算),x % y = d.

3.如果d==0,则最大公约数为y;如果d!=0,则令x=y,y=d,继续第二步。

对于等式ax+by=d中a,b的求解方法,一般是在x,y辗转相除法的过程中递归得到的,具体如下。

假设在辗转相除法的倒数第二步中的x,y为x1,y1,x1 % y1 = d1 != 0。

然后采用上面第三步的方法令x2 = y1, y2 = d1,这时x2 % y2 = 0。说明y2就是我们求的最大公约数d。

这时我们令a2 = 0, b2 = 1,则a2 * x2 + b2 * y2 = d。

通过上面的推倒,我们知道x2 = y1, y2 = d1 = x1 % y1 = x1 - y1 * r (r = x1整除y1) 。

代入公式得到a2 * y1 + b2 * (x1 - y1 * r) = d = b2 * x1 + (a2 - b2*r) * y1 = d.

可以得出结论,a1 = b2, b1 = (a2 - b2*r) 。

转换为c代码如下

static int gcd(int x, int y, int *a, int *b)

{

int q = x/y;

int r = x%y;

int d, a1, b1;

if(r == 0)

{

*a = 0;

*b = 1;

return y;

}

d = gcd(y, r, &a1, &b1);

*a = b1;

*b = a1 - b1*q;

return d;

}

顺序推倒法

由上面的辗转相除法的推倒过程,我们可以得到启示。如果我们定义两个等式如下:

1 * x + 0 * y = x ---------------- (1)

0 * x + 1 * y = y ---------------- (2)

我们计算x/y,令r = x / y,d = x % y = x - (r * y)。我们在上面两个等式的左右两边分别做计算,用上面等式的值 减去 下面等式乘以r。如下

(1 - 0 * r) * x + (0 - 1 * r) * y = x - r * y = d ----------------
(3)

这时候,对等式(2)和(3)做重复的操作,直到d==0。

转化为c代码如下:

static int FastGCD(int x, int y, int *a, int *b)

{

int a1=1, b1=0, a2=0, b2=1;

int q, tmp_a, tmp_b;

int r = x%y;

while((r = x%y)!=0)

{

q = x/y;

tmp_a = a1-q*a2;

tmp_b = b1-q*b2;

a1 = a2, b1 = b2, a2 = tmp_a, b2 = tmp_b;

x = y;

y = r;

}

*a = a2;

*b = b2;

return y;

}

时间: 2024-10-24 16:44:12

[每日练习]最大公约数问题的推倒的相关文章

每日一道题2014/7/23

10015 - Hankson的趣味题 Time Limit: 1000MSMemory Limit: 65535KB DescriptionHanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在课堂上,老师讲解了如何求两个正整数c1 和c2 的最大公约数和最小公倍数.现在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这

java每日小算法(6)

/*[程序6] 题目:输入两个正整数m和n,求其最大公约数和最小公倍数. 1.程序分析:利用辗除法. */ package test; public class test { //最大公约数 public static int commonisor(int n, int m) { int max = (n>=m)?n:m; int min = (n>=m)?m:n; int r = max % min; while(r != 0) { max = min; min = r; r = max %

Cocos2d-x山西推倒胡+扣点房卡麻将下载架设教程

1.数据库还原修改后台数据库jeefwtwo 表:sys_user8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 密码(123456)修改游戏数据库 QPPlatformDB表:DataBaseInfo  SQL的地址端口账号密码表:GameRoomInfo  修改服务器的机器标示 PS,搭建的源码必须完整,本文测试源码来自 Cocos2d-x山西推倒胡+扣点房卡麻将maliwl.com 2.执行脚本每个脚本都要执

51nod 1179 最大的最大公约数

给出N个正整数,找出N个数两两之间最大公约数的最大值.例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5. Input 第1行:一个数N,表示输入正整数的数量.(2 <= N <= 50000) 第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000) Output 输出两两之间最大公约数的最大值. Input示例 4 9 15 25 16 Output示例 5 思路:尝试了两种方法,两种

【第二组】项目冲刺(Beta版本)第六次每日例会 2017/7/24

项目冲刺(Beta版本)第六次每日例会 开发小组:Hunter 冲刺经理:林贵渊 小组成员:林轩宇,张太,李明君,刘仁人 1.每日例会内容 (1)昨天做了什么 1.林轩宇:Button音效及服务器相关内容. 2.刘仁人:二维码制作. 3.张太:查找本地内容. 4.李明君:LOGO设计,Button美化. 5.林贵渊:本地内容整理优化. (2)遇到了什么问题 1.图像传输问题(林轩宇) 2.部分功能存在一些小BUG(李明君,林贵渊) 3.控件及界面优化(刘仁人,李明君) 4.玩家交互没有好的构想[

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

辗转相除法 求最大公约数和最小公倍数

# include<stdio.h> int main() { int a,b,c,x,y; printf("请输入两个正整数,用逗号间隔:"); scanf("%d,%d",&a,&b); x=a; y=b; if (a<b) { c=a; a=b; //要保证 a>b b=c; } while (b!=0) { c=a; a=b; b=c%b; } c=x*y/a; printf("最大公约数为%d,最小公倍数为

求2个数的最小公倍数和最大公约数

1 # -*- coding: UTF-8 -*- 2 3 def gongyueshu(m, n): 4 if n == 0: 5 return m 6 else: 7 return gongyueshu(n, m%n) 8 9 def gongbeishu(m, n): 10 gongyue = gongyueshu(m, n) 11 return (m * n) / gongyue 12 13 gong = gongyueshu(m=18, n=6) 14 print(gong) 15 g

每日构建

http://blog.csdn.net/clever101/article/details/38964069 早在主持开发产品新版本之初,我就有一个略显激进的想法:新产品的测试版本发布频率 至少在一周之内.开发人员倾向于感觉自己软件有相当质量才能交出去测试,而我却认为软件质量的提高主要取决于外部驱动力.互联网软件为什么质量高?这么多 人用它,bug迅速被发现,迅速被修改.非互联网的软件企业要借鉴这个经验,一方面要在项目中迅速应用产品,另一方面要迅速发布测试版本公司测试人员测 试.总之要形成一种