鱼C论坛

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

求最大公约数

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

题目::编写递归函数求两个正整数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编译器,求大婶指点。


最佳答案

查看完整内容

加//标注的地方看看,都是些细节问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
        }
}
加//标注的地方看看,都是些细节问题。
想知道小甲鱼最近在做啥?请访问 -> 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;
     }
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

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

谢谢。。确实。。我之前的代码有问题,领教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

被你坑了。。这段函数是多余的,在a<b的情况下运行一次GCD函数会自动交换a,b的。。不运行一下还真以为我错了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

确实不需要
不管a,b谁大谁小,通过该函数都可以使得其等效为GCD(max(a,b),min(a,b))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

好,谢谢。不是去掉第三行能运行,我原来的代码已经声明了result,你把声明提前了,但是我调试的时候发现不提前也能通过编译。总之谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

羞愧的说一句,我错了哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

第七行加int,what is mean?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

第七行是函数调用,不加int。。我刚今天知道。。函数声明是后要加参数的变量类型,调用时就不用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

现在我又遇到问题了,还是最大公约数问题,直接问你好了。代码贴出来如下,用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;
}                            
能通过编译,运行时出错,提示:“浮点数例外 (核心已转储)”,搞不懂什么意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

while代码段里
--------加个过渡值
int GCD(int a, int b)
{
            int temp;
        while(a%b!=0){
                            temp=a;
                a=b;
                b=temp%b;
        }
        return b;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

这么简单,。。。坑了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 19:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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