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 <stdio.h>
int gcd(int n,int m)
{
	int i;
loop1:if(n<m)
	{
		i=m%n;
		if(i==0) return n;
		else  {m=n;n=i;goto loop1;}
	}
loop2:if(n>m)
	{
		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 <stdio.h>
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;
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值