鱼C论坛

 找回密码
 立即注册
查看: 4407|回复: 14

求最大公约数

[复制链接]
发表于 2013-10-10 22:03:33 | 显示全部楼层 |阅读模式
1鱼币

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


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


最佳答案

查看完整内容

加//标注的地方看看,都是些细节问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-10 22:03:34 | 显示全部楼层
  1. int GCD(int a,int b)
  2. {
  3.         int result;           //            
  4.         if (a%b==0)
  5.                 return b;
  6.         else{
  7.                 result=GCD(b,a%b);     //
  8.                 return result;
  9.         }
  10. }
复制代码
加//标注的地方看看,都是些细节问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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;
     }
}

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-12 13:17:10 | 显示全部楼层

谢谢。确实能解决问题,不过我想问的详细一点。在你的代码中讨论吧。我试了下,去掉第三行代码也能编译并且运行,问题主要是出在第七行。为什么第一行要加int 而第七行不用呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-12 13:18:17 | 显示全部楼层
夏七夕 发表于 2013-10-12 11:37
接着楼上的哥们回答..

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

谢谢。。确实。。我之前的代码有问题,领教了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-12 13:24:15 | 显示全部楼层
夏七夕 发表于 2013-10-12 11:37
接着楼上的哥们回答..

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

被你坑了。。这段函数是多余的,在a<b的情况下运行一次GCD函数会自动交换a,b的。。不运行一下还真以为我错了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-12 15:28:05 | 显示全部楼层
贴地快感 发表于 2013-10-12 13:17
谢谢。确实能解决问题,不过我想问的详细一点。在你的代码中讨论吧。我试了下,去掉第三行代码也能编译并 ...

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

使用道具 举报

发表于 2013-10-12 15:32:26 | 显示全部楼层
贴地快感 发表于 2013-10-12 13:24
被你坑了。。这段函数是多余的,在a

确实不需要
不管a,b谁大谁小,通过该函数都可以使得其等效为GCD(max(a,b),min(a,b))
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-12 16:18:01 | 显示全部楼层
tsembrace 发表于 2013-10-12 15:28
1、去掉第三行能编译运行?是指int result这句么?
去掉的话应该会有问题,都没定义,怎么可以使用呢?
...

好,谢谢。不是去掉第三行能运行,我原来的代码已经声明了result,你把声明提前了,但是我调试的时候发现不提前也能通过编译。总之谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-12 17:06:10 | 显示全部楼层
贴地快感 发表于 2013-10-12 13:24
被你坑了。。这段函数是多余的,在a

羞愧的说一句,我错了哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-12 17:09:50 | 显示全部楼层
贴地快感 发表于 2013-10-12 13:17
谢谢。确实能解决问题,不过我想问的详细一点。在你的代码中讨论吧。我试了下,去掉第三行代码也能编译并 ...

第七行加int,what is mean?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-12 22:37:54 | 显示全部楼层
夏七夕 发表于 2013-10-12 17:09
第七行加int,what is mean?

第七行是函数调用,不加int。。我刚今天知道。。函数声明是后要加参数的变量类型,调用时就不用。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-13 08:05:22 | 显示全部楼层
tsembrace 发表于 2013-10-10 22:03
加//标注的地方看看,都是些细节问题。

现在我又遇到问题了,还是最大公约数问题,直接问你好了。代码贴出来如下,用while。
  1. #include<stdio.h>
  2. int GCD(int a, int b)
  3. {
  4.         while(a%b!=0){
  5.                 a=b;
  6.                 b=a%b;
  7.         }
  8.         return b;
  9. }
  10. int main(void){
  11.         int a,b;
  12.         scanf("%d%d",&a,&b);
  13.         printf("%d",GCD(a,b));
  14.         return 0;
  15. }                           
复制代码
能通过编译,运行时出错,提示:“浮点数例外 (核心已转储)”,搞不懂什么意思。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-13 10:58:13 | 显示全部楼层
贴地快感 发表于 2013-10-13 08:05
现在我又遇到问题了,还是最大公约数问题,直接问你好了。代码贴出来如下,用while。能通过编译,运行时出 ...

while代码段里
--------加个过渡值
  1. int GCD(int a, int b)
  2. {
  3.             int temp;
  4.         while(a%b!=0){
  5.                             temp=a;
  6.                 a=b;
  7.                 b=temp%b;
  8.         }
  9.         return b;
  10. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-14 13:52:07 | 显示全部楼层
tsembrace 发表于 2013-10-13 10:58
while代码段里
--------加个过渡值

这么简单,。。。坑了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 23:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表