又是王老师的一道练习题:
任务描述
1.任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步;
2.以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
3.第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
本关任务:使用更相减损法求取任意两个整数的最大公约数
#include//当n,m都是偶数时,求约2的次数 int divide_time(int n, int m); // 以较大的数减较小的数,接着把所得的差与较小的数比较, 并以大数减小数。继续这个操作,直到所得的减数和差相等为止,并返回该数 int subtrsct(int n, int m); int main() { int n, m; int sub; int divisor;//divisor为最大公约数 scanf("%d%d", &n, &m); //判断n,m是否都为偶数 if (n % 2 == 0&&m % 2 == 0) { int time = divide_time(n, m); sub = subtrsct(n, m); divisor = sub * time; printf("%d", divisor); } else { divisor = subtrsct(n, m); printf("%d", divisor); } return 0; } int divide_time(int n, int m) { int time = 0;//计约2次数 while (1) { if (n % 2 == 0 && m % 2 == 0) { time++; n = n / 2; m = m / 2; } else { break;//若不能再约则跳出 } } return time; } int subtrsct(int n, int m) { int min, max,sub; int temp; min = n; max = m; while(1) { //确保以大减小 if (min > max) { temp = min; min = max; max = temp; } sub = max - min; if (sub == min) { break;// 所得的减数和差相等则跳出 } max = sub; } return sub; }



