贴地快感 发表于 2013-10-10 22:03:33

求最大公约数


题目::编写递归函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),使用Euclid算法:       1.如果a除以b能整除,则最大公约数是b。
       2.否则,最大公约数等于b和a%b的最大公约数。
要求用递归。


我的代码:
#include<math.h>
#include<stdio.h>
int GCD(int a,int b)
{
      if (a%b==0)
                return b;
      else{
                int result;
                result=GCD(int b, int a%b);
                return result;
      }
}
int main(void)
{
      int a,b;
      scanf("%d%d",&a,&b);
      printf("GCD of a and b = %d\n",GCD(a,b));
      return 0;
}
错误提示:main.c: 在函数‘GCD’中:
               main.c:9:14: 错误: expected expression before ‘int’
               main.c:9:14: 错误: 提供给函数‘GCD’的实参太少
               main.c:3:5: 附注: 在此声明
注:我用的是linux下的gcc编译器,求大婶指点。


tsembrace 发表于 2013-10-10 22:03:34

int GCD(int a,int b)
{
        int result;         //          
      if (a%b==0)
                return b;
      else{
                result=GCD(b,a%b);   //
                return result;
      }
}加//标注的地方看看,都是些细节问题。

夏七夕 发表于 2013-10-12 11:37:04

接着楼上的哥们回答..

要求a> b嘛,但是a< b也有可能,加一个函数

void swap(int &a,int &b)
{
   if(b> a)
   {
            b^= a;
             a^= b;
            b^= a;
   }
}

贴地快感 发表于 2013-10-12 13:17:10

tsembrace 发表于 2013-10-10 23:13 static/image/common/back.gif
加//标注的地方看看,都是些细节问题。

谢谢。确实能解决问题,不过我想问的详细一点。在你的代码中讨论吧。我试了下,去掉第三行代码也能编译并且运行,问题主要是出在第七行。为什么第一行要加int 而第七行不用呢?

贴地快感 发表于 2013-10-12 13:18:17

夏七夕 发表于 2013-10-12 11:37 static/image/common/back.gif
接着楼上的哥们回答..

要求a> b嘛,但是a< b也有可能,加一个函数


谢谢。。确实。。我之前的代码有问题,领教了

贴地快感 发表于 2013-10-12 13:24:15

夏七夕 发表于 2013-10-12 11:37 static/image/common/back.gif
接着楼上的哥们回答..

要求a> b嘛,但是a< b也有可能,加一个函数


被你坑了。。这段函数是多余的,在a<b的情况下运行一次GCD函数会自动交换a,b的。。不运行一下还真以为我错了。。

tsembrace 发表于 2013-10-12 15:28:05

贴地快感 发表于 2013-10-12 13:17 static/image/common/back.gif
谢谢。确实能解决问题,不过我想问的详细一点。在你的代码中讨论吧。我试了下,去掉第三行代码也能编译并 ...

1、去掉第三行能编译运行?是指int result这句么?
去掉的话应该会有问题,都没定义,怎么可以使用呢?
2、第一行加int是作为GCD这个函数定义的时候必须标注返回类型啊
第七行不是不需要,而是不能加。因为第七行属于调用该函数了。调用函数时候括弧里只能是实参,如果你再加给类型标识,那就成了又新定义了一个该类型的变量了;而实际上就算要定义,你也应该在代码块开头定义。所以报错也就必然了。

tsembrace 发表于 2013-10-12 15:32:26

贴地快感 发表于 2013-10-12 13:24 static/image/common/back.gif
被你坑了。。这段函数是多余的,在a

确实不需要
不管a,b谁大谁小,通过该函数都可以使得其等效为GCD(max(a,b),min(a,b))

贴地快感 发表于 2013-10-12 16:18:01

tsembrace 发表于 2013-10-12 15:28 static/image/common/back.gif
1、去掉第三行能编译运行?是指int result这句么?
去掉的话应该会有问题,都没定义,怎么可以使用呢?
...

好,谢谢。不是去掉第三行能运行,我原来的代码已经声明了result,你把声明提前了,但是我调试的时候发现不提前也能通过编译。总之谢谢

夏七夕 发表于 2013-10-12 17:06:10

贴地快感 发表于 2013-10-12 13:24 static/image/common/back.gif
被你坑了。。这段函数是多余的,在a

羞愧的说一句,我错了哈

夏七夕 发表于 2013-10-12 17:09:50

贴地快感 发表于 2013-10-12 13:17 static/image/common/back.gif
谢谢。确实能解决问题,不过我想问的详细一点。在你的代码中讨论吧。我试了下,去掉第三行代码也能编译并 ...

第七行加int,what is mean?

贴地快感 发表于 2013-10-12 22:37:54

夏七夕 发表于 2013-10-12 17:09 static/image/common/back.gif
第七行加int,what is mean?

第七行是函数调用,不加int。。我刚今天知道。。函数声明是后要加参数的变量类型,调用时就不用。

贴地快感 发表于 2013-10-13 08:05:22

tsembrace 发表于 2013-10-10 22:03 static/image/common/back.gif
加//标注的地方看看,都是些细节问题。

现在我又遇到问题了,还是最大公约数问题,直接问你好了。代码贴出来如下,用while。#include<stdio.h>
int GCD(int a, int b)
{
      while(a%b!=0){
                a=b;
                b=a%b;
      }
      return b;
}
int main(void){
      int a,b;
      scanf("%d%d",&a,&b);
      printf("%d",GCD(a,b));
      return 0;
}                            能通过编译,运行时出错,提示:“浮点数例外 (核心已转储)”,搞不懂什么意思。

tsembrace 发表于 2013-10-13 10:58:13

贴地快感 发表于 2013-10-13 08:05 static/image/common/back.gif
现在我又遇到问题了,还是最大公约数问题,直接问你好了。代码贴出来如下,用while。能通过编译,运行时出 ...

while代码段里
--------加个过渡值int GCD(int a, int b)
{
          int temp;
      while(a%b!=0){
                          temp=a;
                a=b;
                b=temp%b;
      }
      return b;
}

贴地快感 发表于 2013-10-14 13:52:07

tsembrace 发表于 2013-10-13 10:58 static/image/common/back.gif
while代码段里
--------加个过渡值

这么简单,。。。坑了
页: [1]
查看完整版本: 求最大公约数