我最近开始学习C和编程,我们被告知制作一个程序,使用递归找到两个数字的GCD和LCM。
经过一番磨练后,我设法将它们结合起来。
#include<stdio.h>
int gcd(int a,int b);
int main()
{
int a,b,l,temp;
printf("Enter two numbers :\n");
scanf("%d%d",&a,&b);
if(a<b)
{
temp=a;
a=b;
b=temp;
}
l=gcd(a,b);
printf("GCD = %i\nLCM = %i",l,a*b/l);
return 0;
}
int gcd(int a,int b)
{
static int c;
c=a%b;
a=b;
b=c;
if(c!=0)
{
gcd(a,b);
}
else
return a;
}
现在由于某些我不知道的原因,如果没有“else”,该功能将无效。更具体地说是这样:
int gcd(int a,int b)
{
static int c;
c=a%b;
a=b;
b=c;
if(c!=0)
{
gcd(a,b);
}
return a;
}
虽然与作业无关,但我觉得我应该明白这里的问题是什么。作为一个新手,我将不胜感激任何帮助。
如果问题太愚蠢或代码太乱,我会提前道歉。
答案 0 :(得分:0)
您询问了代码中的问题。这里,
static int c;
为什么它是静态的,而且你不需要第三个变量来使用递归来计算gcd。 和,
gcd(a,b);
你在什么变量中返回gcd。这根本没有意义。它不是一个void函数,它返回一个int。
现在正确的方法,
if (b != 0)
return gcd(b, a%b);
else
return a;
就是这样。
答案 1 :(得分:0)
问题是递归调用:
int gcd(int a,int b)
{
static int c;
c=a%b;
a=b;
b=c;
if(c!=0)
{
gcd(a,b); // The problem is here
}
else
return a;
}
您已经采用了两种不同的方法:
c!=0
,则没有return语句。你的函数有来返回int。通常编译器会给出警告,因为您将返回一个随机数see here。所以,让我们说你的函数与其他人一起工作是幸运的。正确的方法是返回你的递归调用结果,如Sanjay-sopho已经说过:
return gcd(a,b);
另外,在else上的if和no大括号上使用大括号是不好的编码风格;)两种情况都很好,但保持相同。