本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
#include<stdio.h>
main()
{
int m, n;
int m_cup, n_cup, ret=1;
scanf("%d %d", &m, &n);
m_cup=m;
n_cup=n;
//用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。//
while (ret != 0)
{
ret = m_cup%n_cup;
m_cup=n_cup;
n_cup=ret;
}
printf("%d", m_cup);//最大公约数
printf(" %d", m * n /m_cup);//最小公倍数
return 0;
}
这里的关键是选择辗转相除法去求最大公约数,和最小公倍数的求法。
提炼一下嗷。
一开始没没理解到为什么要引入_cup,原因是在算最小公倍数的时候需要m*n/最大公倍数,若没有_cup的话m,n的值早已改变就会出错,而利用_cup来算,m n的值依旧是初值,之前一直忽略了这个地方。
考试时有感而发,更换了一种做法