写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个整数在主函数中从键盘输入。
输入
每行输入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;
}