数据结构论坛

首页 » 分类 » 问答 » 数据结构与算法第十节递归下的辗转相除法
TUhjnbcbe - 2021/3/28 5:30:00

最大公约数图解:

①:线段A和线段B分别代表两个数值,求既能度量A又能度量B的最大线段C,也就是A和B的最大公约数。

②:如果线段B能度量线段A,那么B就A约数,如果不能,则会多出一段长度N,那么线段A就可以表示为多个线段B加线段N。

③:求解过程就从A和B的问题,转换到了求解B和N,B和N又转换到了N和C。依次递归重复,直到线段C能够能够度量N(上一层的除数N和上一层B%N的余数C能够发生整除),如果线段C既能度量B又能度量N,那么C也能度量A。

总结过程:被除数%除数------余数,问题重新转换成被除数(上层除数)%除数(上层余数)------余数,直到出现了上层除数整除上层余数。

两种实现方法:

第一种:迭代

#includeiostreamusingnamespacestd;//自定义交换函数voidswap(inta,intb){inttemp=a;a=b;b=temp;}intmain(){inta,b;cinab;while(b){//直到出现b等于0,也就是说上一轮拿到的余数a等于0的时候//第一步:拿到a%b的余数a=a%b;//第二步:b要重新作为被除数进入下一轮运算,余数a要作为除数进入下轮运算swap(a,b);}//跳出while循环的时候a和b已经发生互换,a保存着最后一轮整除的除数值coutaendl;}

第二种:递归

#includeiostreamusingnamespacestd;//自定义递归函数intg(inta,intb){/*根据迭代程序可知:判断本轮传进来的b是否为0,也就是上一轮的a=a%b余数是否为0,如果为0返回除数b即可,上一轮的除数b已经放入了本轮的a当中,所以返回a即可!*/returnb?g(b,a%b):a;}intmain(){inta,b;cinab;coutg(a,b)endl;}一只小跃跃

1
查看完整版本: 数据结构与算法第十节递归下的辗转相除法