传统方法
在求最大公约数和最小公倍数,我们先输入两个值,求出其中的较大值和较小值,并用i和j分别来进行接受,并且使用while循环,当n和m都能整除较小值的时候,跳出循环,不行的话就较小值一直--,直到整除为止。
int main()
{
int n = 0;
int m = 0;
while (scanf("%d %d", &n, &m) == 2)
{
int min = n < m ? n : m;
int max = n > m ? n : m;
int i = min;
int j = max;
while (1)
{
if (n % i == 0 && m % i == 0)
{
break;
}
i--;//i就是最小公约数
}
while (1)
{
if (n % j == 0 && m % j == 0)
{
break;
}
j++;//j就是最大公倍数
}
}
return 0;
}
同理,求最小公倍数也是一样的道理。
但是这个算法存在缺点, 那就是运行效率不够高,因此,我们提出一种新的方式,叫辗转相除法。
辗转相除法
//辗转相除法
int main()
{
long m, n = 0;
while (scanf("%ld %ld", &n, &m) == 2)
{
long i = n;
long j = m;
long r = 0;
while (r = i % j)
{
i = j;
j = r;
}
printf("%ld %ld", j, m * n / j);
}
}
辗转相除法的优势在于极大的提高了代码的运行效率。
举例: 我们把取的值定义为i,j,r
假设i=24,j=18;我们要求最大公约数。用两者进行求模i%j,此时求模值=6,我们把它赋给r,此时已经找到最大公约数,如果还没有找到,我们就继续把 i 赋给j,j赋给r,以此类推,当while(r=i%j)判断条件为0,说明已经找到最大公约数,循环结束。