| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 867 人关注过本帖
标题:求助这个函数的递归调用为什么 能返回最大公约数
只看楼主 加入收藏
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
结帖率:82%
收藏
已结贴  问题点数:20 回复次数:5 
求助这个函数的递归调用为什么 能返回最大公约数
int gcd(int x,int y)
{
   return y==0?x:gcd(y,x%y);
}
有人能解译一下吗?
搜索更多相关主题的帖子: 函数 调用 返回 最大公约数 int 
2018-04-19 09:23
nosnoy
Rank: 9Rank: 9Rank: 9
来 自:mcu
等 级:贵宾
威 望:14
帖 子:541
专家分:1178
注 册:2016-9-17
收藏
得分:20 
假定 x=4 y=15
1:x=y=15,y=x%y=4//小值变成除数
2:x=y=4,y=x%y=3//先除小的数然后继续向
3:x=y=3,y=x%y=1
4: x=y=1,y=3%1=0
return x=1

x=3 y=15
1:x=y=15,y=x%y=3
2:x=3 y=0
return x=3

辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。

穷举是最暴力的美学
2018-04-19 10:32
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
回复 2楼 nosnoy
谢谢你的讲解
2018-04-19 13:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
最近看到很多解
ax+by==c这类的~

其实也可以用辗转相除法的思想实现~

举个例子就明白了~

例如求解

39x+17y==10001

用辗转相除法~

+a+0=39   
+0+b=17
+a-2b=5
-3a+7b=2
7a-16b=1
-17a-39b=0

这里可以得到
gcd(39,17)=1

可以看出t*(39*7-17*16)==t

10001%gcd(39,17)==0

所以该方程存在整数解

39*(7*10001)-17*(16*10001)==10001

如果x取最少正整数
那么
x=(7*(10001%17))%17=1
y=(10001-1*39)/17=586

所以
x=1,y=586是这个方程的一个特解

通解为
{
    x=1+17t
    y=(10001-39*(1+17t))/17
}

化简一下就是
{
    x=1+17t
    y=586-39t
}

下面这个代码可以得到这个不定方程的通解

程序代码:

#include<stdio.h>
#include<assert.h>

int main( void )
{
    int i=0;
    
    const int a=39;
    const int b=17;
    
    for (i=0;i!=30;++i)
    {
        assert(39*(1+17*i)+17*(586-39*i)==10001);

        printf("39*(%-4d)+17*(%-4d)=10001\n",1+17*i,586-39*i);
    }
    
    return 0;
}



拓展一下,其实"剩余定理"实质就是一个不定方程(组),当时我看某方法就是怎么配个常数n,当时怎么也看不出一个所以然出来,然后用辗转相除法就容易理解多了,当然如果是3组(多组)数据则算出一组后把参数代入消元再继续算下一组就是了~

[此贴子已经被作者于2018-4-19 21:18编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-19 21:16
nosnoy
Rank: 9Rank: 9Rank: 9
来 自:mcu
等 级:贵宾
威 望:14
帖 子:541
专家分:1178
注 册:2016-9-17
收藏
得分:0 
回复 4楼 九转星河
额二元一次方程有无数个解  他在坐标系中是一条直线

二元一次方程组才有唯一解;

穷举是最暴力的美学
2018-04-19 21:50
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用nosnoy在2018-4-19 21:50:11的发言:

额二元一次方程有无数个解  他在坐标系中是一条直线

二元一次方程组才有唯一解;

忘记说的是整数解了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-19 22:24
快速回复:求助这个函数的递归调用为什么 能返回最大公约数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015267 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved