| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2221 人关注过本帖
标题:求最大公约数 为什么最后输出的是无限的循环?
只看楼主 加入收藏
意林林
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2015-12-29
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:13 
求最大公约数 为什么最后输出的是无限的循环?
#include<stdio.h>
void main( )
{
    int a,b,c;
    printf("输入需要找最大公约数的两个数\n");
    scanf("%d,%d",&a,&b);
    c=(a>b)?a:b;
    for(c=a;c>0;c--)
    {
        while(a%c==0&&b%c==0)
            printf("%d",c);
    }
}
搜索更多相关主题的帖子: 公约数 
2015-12-30 23:48
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:4 
大约这样行不

程序代码:
int main (void)
{
    int a,b,c;
    printf("输入需要找最大公约数的两个数\n");
    scanf("%d%d",&a,&b);
    int s=1;
    for(c=1;c<=((a>b)?a:b);c++)
    {
       if(a%c==0 && b%c==0) s=c;
    }
    printf("%d",s);
    return 0;
}

DO IT YOURSELF !
2015-12-31 08:36
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
有个叫辗转相除的专业求最大公约数的
大约如下代码吧

程序代码:
int f(int a,int b)
{
    int t;
    if(a<b) 
    {
        t=a;
        a=b;
        b=t;
    }
    int c,d;
    while(1)
    {
        c=a/b;
        d=a%b;
        if(d==0) return b;
        a=b;
        b=d;

    }
}

DO IT YOURSELF !
2015-12-31 10:09
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
哦 还有递归

程序代码:
int gcd(int x,int y)   
//欧几里得辗转相除法求两数的最大的公约数
{
    if(x<y)    return gcd(y,x);
    if(x%y!=0) return gcd(y,x%y);
    else return y;
}

DO IT YOURSELF !
2015-12-31 10:11
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:1 
还可以这样

程序代码:
int foo(int e,int f)
{
    if(e<f) foo(f,e); 
    int b,c,d;
    for(b = e, c = f; d = b % c; b = c, c = d);
    return c;
}

DO IT YOURSELF !
2015-12-31 10:17
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
楼主主要有两处错误:
1、c=(a>b)?a:b;后,for语句里c=a就矛盾了。
2、while(a%c==0&&b%c==0)肯定用错,死循环在这里发生。
结合你的代码修改如下:
程序代码:
#include<stdio.h>
void main( )
{
    int a,b,c;
    printf("输入需要找最大公约数的两个数\n");
    scanf("%d,%d",&a,&b);
    for(c=a<b?a:b;c&&(a%c||b%c);c--);
    printf("%d\n",c);
}

能编个毛线衣吗?
2015-12-31 10:56
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
另:为提高循环效率,在for语句的循环条件里固定值的判断最好不要用算式,因为每次循环判断时都做运算,极大降低效率,如下几例均红色部分均不可取:
for(i=0;i<a*b;i++)  //a、b值已经固定,并且在循环里不再改变,类似的二楼w版主的c<=((a>b)?a:b)固定值的二目运算也是不可取的
for(i=0;i<=sqrt(n);i++) //这个循环再找素数里常用,貌似找到sqrt(n)位置减少了循环次数,但其实每次都调用开方函数和进行类型转换,相反降低循环效率

能编个毛线衣吗?
2015-12-31 11:12
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 8楼 wmf2014
我并没有追求效率  而是追求代码行数少 嘿嘿

DO IT YOURSELF !
2015-12-31 11:14
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 9楼 wp231957
在合理规则下追求代码精炼是艺术,否则容易误导初学者。
*代码精炼不等于执行效率高,也不等于实际机器代码就少!

[此贴子已经被作者于2015-12-31 11:21编辑过]


能编个毛线衣吗?
2015-12-31 11:18
意林林
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2015-12-29
收藏
得分:0 
回复 4楼 wp231957
恩恩  
我去看了这个辗转相除法,明白了
多谢提示。。
2016-01-01 12:44
快速回复:求最大公约数 为什么最后输出的是无限的循环?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035116 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved