又是王老师的一道练习题:
任务描述
1.任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步;
2.以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
3.第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
本关任务:使用更相减损法求取任意两个整数的最大公约数
#include <stdio.h>
//当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;
}
运行结果如下: