鱼C论坛

 找回密码
 立即注册
查看: 4704|回复: 11

用递归求最大公约数,急

[复制链接]
发表于 2013-11-17 19:15:34 | 显示全部楼层 |阅读模式
10鱼币
第一个算法我想用递归实现辗转相除法求最大公约数,可是怎么返回当c=0时b的值呢?第二个算法设两个整数为x、y   如果x=y,则最大公约数与x值(y值)相同;
   如果x>y,则最大公约数与x-y和y的最大公约数相同;
   如果x<y,则最大公约数与x和y-x的最大公约数相同。
可是没有实现是肿么回事- -,求指教啊,急................

#include<stdio.h>
int divide(int a,int b);
int main()
{
        int a,b;
       
        while(scanf("%d%d",&a,&b)==2)
    printf("(%d %d)=%d\n",a,b,divide(a,b));
       
        return 0;       
       
}

int divide(int a,int b)
{
        int c;
       
        c=a%b;
        printf("c:%d,a:%d,b:%d\n",c,a,b);
       
        if(c!=0)
        divide(b,c);
        printf("c:%d,a:%d,b:%d\n",c,a,b);
       
        return b;
}
/*
int divide(int a,int b)
{
        if(a>b)
        divide(a-b,b);
       
        else if(a<b)
        divide(a,b-a);
       
        else
        return b;
}
*/

最佳答案

查看完整内容

第二问效果截图: 代码如下:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-17 19:15:35 | 显示全部楼层
第二问效果截图:
1.png

代码如下:
#include <stdio.h>
#include<math.h>


//第二个算法设两个整数为x、y   
//如果x=y,则最大公约数与x值(y值)相同;
//如果x>y,则最大公约数与x-y和y的最大公约数相同;
//如果x<y,则最大公约数与x和y-x的最大公约数相同。
//结果为1的话,那么原来的两个数是互质数
int func(int x,int y)
{
        if(x==y)
        {
                return x;
        }
        else if(x>y)
        {
                return func(x-y,y);
        }
        else
        {
                return func(x,y-x);
        }
}

void main ()
{
        printf("4,8最大公约数为:%d\n",func(4,8));
        printf("8,16最大公约数为:%d\n",func(8,16));
        printf("8,19最大公约数为:%d\n",func(8,19));
        printf("1515,600最大公约数为:%d\n",func(1515,600));
}

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

使用道具 举报

 楼主| 发表于 2013-11-17 19:44:56 | 显示全部楼层
我在vc下编译#include<stdio.h>
int divide(int a,int b);
int main()
{
        int a,b;
       
        while(scanf("%d%d",&a,&b)==2)
    printf("(%d %d)=%d\n",a,b,divide(a,b));
       
        return 0;       
       
}

int divide(int a,int b)
{
        int c;
       
        c=a%b;
        printf("c:%d,a:%d,b:%d\n",c,a,b);
       
        if(c==0)
        return b;
        else
        {
        divide(b,c);
    printf("c:%d,a:%d,b:%d\n",c,a,b);
   
   
        }                QQ图片20131117194455.jpg ,输出这个
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-17 19:49:36 | 显示全部楼层
#include<stdio.h>
int divide(int a,int b);
int main()
{
        int a,b;
       
        while(scanf("%d%d",&a,&b)==2)
    printf("(%d %d)=%d\n",a,b,divide(a,b));
       
        return 0;       
       
}

int divide(int a,int b)
{
        int c;
       
        c=a%b;
       
       
        if(c==0)
        return b;
        else
        {
        divide(b,c);
   
   
   
        }               
}
26.jpg ,俩个代码只是相差两条输出语句啊,怎么最后的返回值就不一样了???

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

使用道具 举报

 楼主| 发表于 2013-11-17 19:52:54 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-18 11:42:32 | 显示全部楼层
哎,我给你例子参考吧(希望给我评下分呀)
效果截图:
1.png

代码如下:
//用递归求最大公约数
//结果为1的话,那么原来的两个数是互质数
int divide(int a,int b)
{
        int n=a>b?a%b:b%a;//获取大数除小数的余数
        if(0==n)
        {
                return a>b?b:a;//返回除数
        }
        else
        {
                return divide(n,a>b?b:a); //辗转相除
        }
}


int main(int argc, char* argv[])
{
        printf("4,8最大公约数为:%d\n",divide(4,8));
        printf("8,16最大公约数为:%d\n",divide(8,16));
        printf("8,19最大公约数为:%d\n",divide(8,19));
        printf("1515,600最大公约数为:%d\n",divide(1515,600));
        return 0;
}

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

使用道具 举报

发表于 2013-11-18 11:56:02 | 显示全部楼层
原理:
先用小的一个数除大的一个数,得第一个余数;
再用第一个余数除小的一个数,得第二个余数;
又用第二个余数除第一个余数,得第三个余数;
这样逐次用后一个数去除前一个余数,直到余数是0为止。那么,最后一个除数就是所求的最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。

例如求1515和600的最大公约数,
第一次:用600除1515,商2余315;
第二次:用315除600,商1余285;
第三次:用285除315,商1余30;
第四次:用30除285,商9余15;
第五次:用15除30,商2余0。
1515和600的最大公约数是15。

注意:
3除2和3除以2是有区别的。
3除2是:2/3
3除以2是:3/2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-18 12:17:04 | 显示全部楼层
诸葛暗 发表于 2013-11-17 19:49
#include
int divide(int a,int b);
int main()

int divide(int a,int b)
{
         int c;
         
        c=a%b;
         
        
        if(c==0)
         return b;
         else
         {
         //divide(b,c);
            return divide(b,c);
     
   
   
         }               
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-18 21:23:40 | 显示全部楼层
friendan 发表于 2013-11-18 11:42
哎,我给你例子参考吧(希望给我评下分呀)
效果截图:

谢谢了,(*^__^*) 我找到错误的原因了,返回值有问题,if(c!=0)
                                                                        b = divide(b,c);就好,楼下那种方法也对,能不能帮我看下第二个问题呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-18 21:24:16 | 显示全部楼层
仰望天上的光 发表于 2013-11-18 12:17
int divide(int a,int b)
{
         int c;

再帮忙看下第二个问题吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-27 08:26:09 | 显示全部楼层
friendan 发表于 2013-11-17 19:15
第二问效果截图:

谢谢了,我发现是编译器的问题= =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-28 00:22:16 | 显示全部楼层
用递归求最大公约数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 20:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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