问题描述
Description
有多个测试用例,每行两个正整数x,y,保证x*y不超过2^31-1。如果x与y都为0,则输入结束。
每行输出一个测试用例的结果,即x与y的最小公倍数。(最后一行有回车)
Sample Input
4 5
3 6
0 0
Sample Output
20
6
Source
ericxie
源代码及详细注释
这个题先用了辗转相除法求最大公约数,再用xy的乘积除最大公约数,得到最大公倍数。
欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。
欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
这里我写了两个源代码,大家比较下差异。
#include<stdio.h>
int main()
{
int x,y,s,a;
while(scanf("%d %d",&x,&y)&&x!=0&&y!=0)//根据题意来写
{
s=x*y;//xy乘积
while(y!=0)//辗转相除法
{
a=x%y;
x=y;
y=a;
}
s=s/x;
printf("%d\n",s);
}
return 0;
}
下面的代码用到了递归思想,构造了一个gcd函数。看不懂没关系的,靠熟练度能解决的事都不叫事,慢慢来。百度搜菜鸟教程,慢慢补基础知识
#include <stdio.h>
int gcd(int x,int y)
{
if(y==0)
{
return x;//返回了最大公约数
}
else
{
return gcd(y,x%y);//递归,调用自己
}
}
int main()
{
int x,y,s;
while(scanf("%d%d",&x,&y)&&x!=0&&y!=0)
{
s=x*y;
s=s/gcd(x,y);//调用gcd函数得到最大公约数
printf("%d\n",s);
}
return 0;
}
写于2021年8月4日22:51分。