最大公约数图解:
①:线段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;}一只小跃跃