| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 546 人关注过本帖
标题:最大公约数问题?求助!!!
只看楼主 加入收藏
Incomplete
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-8-4
结帖率:66.67%
收藏
已结贴  问题点数:10 回复次数:6 
最大公约数问题?求助!!!
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int x,y;
    cout<<"please enter two integer numbers:";
    cin>>x>>y;
    x=(x+y+fabs(x-y))/2;
    y=(x+y-fabs(x-y))/2;
    int r;
    do
    {
        r=x%y;
        x=y;
        y=r;
    }
    while(r);
    cout<<"The common denominator is: "<<x<<endl;
    return 0;
}

运行结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

7和8的最大公约数不是1吗?怎么是8,是我写的程序有错吗?还望高手指教,谢谢!
搜索更多相关主题的帖子: 最大公约数 
2010-08-08 22:52
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
    x=(x+y+fabs(x-y))/2;
    y=(x+y-fabs(x-y))/2;

这两句是干什么用的?
2010-08-08 23:52
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
哦,是为了让 x 是两个数的较大者是吧?

其实不用这么写,小数除以大数的余数还是小数,所以如果 x 小的话,进循环里之后。

r = 7 % 8 (7 % 8 还是 7)
然后 x = y; y = r; 就能把两个数换过来,如果本来 x 就大,就相当于做了一次辗转相除了。


不过我没看出来你这个运行的为什么不对,你自己调试一下唄~~
2010-08-08 23:56
ragnaros
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:15
专家分:105
注 册:2010-7-26
收藏
得分:2 
楼上说的很对!
    x=(x+y+fabs(x-y))/2;    //这里如果x<y,那么x=y,也就是说如果输入7 8,经过这条语句x被赋值为8
    y=(x+y-fabs(x-y))/2;    //这里y开始是等于8,而x经过上条语句也被赋值为8,所以y还是等于8
也就是说这两条语句一执行,当x<y时,x和y都被赋值为它们中较大的那个数,也就是求两个较大数的公约数,结果还是较大数本身。
程序代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int x,y;
    cout<<"please enter two integer numbers:";
    cin>>x>>y;
    //x=(x+y+fabs(x-y))/2;    
    //y=(x+y-fabs(x-y))/2;
    int r;
    do
    {
        r=x%y;
        x=y;
        y=r;
    }
    while(r);
    cout<<"The common denominator is: "<<x<<endl;
    return 0;
}
注释掉这两句就没问题了。

2010-08-09 09:11
towhee
Rank: 2
来 自:石家庄火车站
等 级:论坛游民
威 望:1
帖 子:48
专家分:69
注 册:2010-8-8
收藏
得分:3 
楼上说的很对!
x=(x+y+fabs(x-y))/2;
y=(x+y-fabs(x-y))/2;
第一句的结果改变了x的值,违背了第二句的原意。
单就这两句来说,可以增加一个中间变量来将x和y对调。

最穷无非讨饭,不死终会出头
2010-08-09 10:48
Incomplete
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-8-4
收藏
得分:0 
回复 3楼 pangding
谢谢!看来不能乱用max=(a+b+fabs(a-b))/2;和min=(a+b-fabs(a-b))/2;这个公式。
我写了个递归的:
#include<iostream>
using namespace std;
int GCD(int x,int y)
{
    if(x%y==0)
        return y;
    return GCD(y,x%y);
}
int main()
{
    int x,y;
    cout<<"please enter two integer numbers:";
    cin>>y>>x;
    cout<<"The common denominator is: "<<GCD(x,y)<<endl;
    return 0;
}

[ 本帖最后由 Incomplete 于 2010-8-9 13:45 编辑 ]
2010-08-09 13:36
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
还有一个小问题忘了说了,在做第一次除法之前,得看一下 y 是不是 0,要不然是会出错的。
最简捷的写法可能是像下面这样:
程序代码:
int gcd(int a, int b)
{
    while (b) {
    int t = a%b;
        a = b;
        b = t;
   }
   return a;
}

这样 b 是零的时候是直接 return a,可以省去判断。
2010-08-10 01:20
快速回复:最大公约数问题?求助!!!
数据加载中...
 
   



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

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