C语言:编求GCD和LCM的函数

题目描述:求GCD和LCM,即指求最大公约数和最小公倍数。

写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个整数在主函数中从键盘输入。

输入
每行输入2个正整数。若输入的2个整数中任何一个为0则结束输入。

假设这2个正整数的乘积值不会超过4个字节的表示范围。

输出
每行对应输出最大公约数和最小公倍数。

样例输入
2,4
12,42
7,21
6,0
样例输出
GCD=2,LCM=4
GCD=6,LCM=84
GCD=7,LCM=21

#include 
int gcd(int n,int m)
{
	int i;
loop1:if(nm)
	{
		i=n%m;
		if(i==0) return m;
		else  {n=m;m=i;goto loop2;}
	}
}

int lcm(int GCD,int n,int m)
{
	int x;
	x=n*m/GCD;
	return x;
}

int main()
{
	int n,m,GCD,LCM;
	while (scanf("%d,%d",&n,&m)!=EOF&&m*n!=0)
	{
		GCD=gcd(n,m);
		LCM=lcm(GCD,n,m);
		printf("GCD=%d,LCM=%d\n",GCD,LCM);
	}
	return 0;
}

这个程序太复杂了,而且老师说尽量不要使用goto,但是这里我用了2遍,后来下课后我又去改了一下,不知道算不算得上优化,就是把goto给改了,然后把loop1,loop2给合到一起。
程序如下:

#include 
int gcd(int n,int m)
{
	int i=1,x,y;  /*始终让x最大,y最小*/ 
	if(n>m) {x=n; y=m;}
	else x=m;y=n;
    while (i!=0)
    {
    	i=x%y;
    	if(i==0) return y;
    	else {x=y;y=i;}
	}
}

int lcm(int GCD,int n,int m)
{
	int x;
	x=n*m/GCD;
	return x;
}

int main()
{
	int n,m,GCD,LCM;
	while (scanf("%d,%d",&n,&m)!=EOF&&m*n!=0)
	{
		GCD=gcd(n,m);
		LCM=lcm(GCD,n,m);
		printf("GCD=%d,LCM=%d\n",GCD,LCM);
	}
	return 0;
}

你可能感兴趣的:(C语言:编求GCD和LCM的函数)