注册 登录
编程论坛 C++教室

计算两个整分数的和

yi157 发布于 2008-10-25 20:57, 1658 次点击
编写一程序计算两个整分数的和。程序运行结果应具有如下形式:
输入第一个分数:1/2
输入第二个分数:2/5
两分数的和为:9/10
主要是有分数没用过,请分析一下如何实现?谢谢

[[it] 本帖最后由 yi157 于 2008-10-25 20:58 编辑 [/it]]
13 回复
#2
lockhawk2008-10-25 21:26
已经试过,能正确输出
#include <iostream.h>
int gb(int,int);
int gb(int a,int b)
{
    for(int temp=a;temp<=a*b;temp++)
        if(temp%a==0&&temp%b==0)
            return temp;
}
void jisuan(int,int,int,int);
void jisuan(int a,int b,int c,int d)
{
    cout<<a<<'/'<<b<<'+'<<c<<'/'<<d<<'='<<(gb(b,d)*a/b+gb(b,d)*c/d)<<'/'<<gb(b,d)<<endl;
}
int main()
{
    int a,b,c,d;
    cout<<"请输入分数算式a/b+c/d的a,b,c,d:"<<endl;
    cin>>a>>b>>c>>d;
    while(b==0||d==0)
    {
        cout<<"输入错误!重新输入!"<<endl;
        cin>>a>>b>>c>>d;
    }
    jisuan(a,b,c,d);
    return 0;
}

[[it] 本帖最后由 lockhawk 于 2008-10-25 21:34 编辑 [/it]]
#3
lockhawk2008-10-25 21:38
但是为什么刚才我这样写的时候也能通过编译,但是结果不对。
void jisuan(int a,int b,int c,int d)
{
    cout<<a<<'/'<<b<<'+'<<c<<'/'<<d<<'='<<(a/b*gb(b,d)+gb(b,d)*c/d*gb(b,d))<<'/'<<gb(b,d)<<endl;
}
就是a/b和gb(b,d)的位置调换了一下,输出分母正确,但分子不正确。如果是乘号*让编译器误认为*gb(b,d)是指针,那应该不能通过编译啊
#4
lionmusicyj2008-10-25 23:56
呵呵~
其实可以考虑用重载+号哟~
我也没试过,但是应该可以的~
#5
tfg01162008-10-26 09:46
#include<iostream>
using namespace std;

class Fract
{
    int num;
    int den;
public:
        Fract(int a = 0, int b = 1)
        {
            num = a;
            den = b;
        }
    int gcd(int m, int n)
    {
        int r;
        if(m < n)
        {
            r = m;
            m = n;
            n = r;
        }
        while(r = m%n)
        {
            m = n;
            n = r;
        }
        return n;
    }
    Fract add(Fract f);
    void show()
    {
        cout<<num<<"/"<<den<<endl;
    }
};
Fract Fract::add(Fract f)
{
    Fract sum;
    sum.den = den * f.den;
    sum.num = f.den*num + den*f.num;
    int x = gcd(sum.num, sum.den);
    sum.num = sum.num/x;
    sum.den = sum.den/x;
    return sum;
}
void main()
{
    Fract f1(1, 2), f2(2, 5), f3;
    f3 = f1.add(f2);
    f3.show();
}楼主试一下
#6
yi1572008-10-26 20:52
[bo][un]tfg0116[/un] 在 2008-10-26 09:46 的发言:[/bo]

#include<iostream>
using namespace std;

class Fract
{
    int num;
    int den;
public:
        Fract(int a = 0, int b = 1)
        {
            num = a;
            den = b;
        }
    int gcd(int m, int n)
    {
        int r;
        if(m < n)
        {
            r = m;
            m = n;
            n = r;
        }
        while(r = m%n)
        {
            m = n;
            n = r;
        }
        return n;
    }
    Fract add(Fract f);
    void show()
    {
        cout<<num<<"/"<<den<<endl;
    }
};
Fract Fract::add(Fract f)
{
    Fract sum;
    sum.den = den * f.den;
    sum.num = f.den*num + den*f.num;
    int x = gcd(sum.num, sum.den);
    sum.num = sum.num/x;
    sum.den = sum.den/x;
    return sum;
}
void main()
{
    Fract f1(1, 2), f2(2, 5), f3;
    f3 = f1.add(f2);
    f3.show();
}楼主试一下

还要加点内容才行,是针对任何分数计算的
谢谢
#7
yi1572008-10-26 20:54
[bo][un]lockhawk[/un] 在 2008-10-25 21:38 的发言:[/bo]

但是为什么刚才我这样写的时候也能通过编译,但是结果不对。
void jisuan(int a,int b,int c,int d)
{
    cout<<a<<'/'<<b<<'+'<<c<<'/'<<d<<'='<<(a/b*gb(b,d)+gb(b,d)*c/d*gb(b,d))<<'/'<<gb(b,d)<<endl;
}
就是a/b和gb(b,d)的位置调换了一下,输出分母正确,但分子不正确。如果是乘号*让编译器误认为*gb(b,d)是指针,那应该不能通过编译啊

没有声明指针应该不会吧
其它基本满足,谢谢
#8
tfg01162008-10-27 20:31
剩下的工作可以自己改一下,加个函数便可实现
#9
csy198811222008-10-29 18:43
#include <iostream>
using namespace std;
void main()
{
int a,b,c,d,e,f;
    cout<<"输入两个分数相加:a/b+c/d="<<endl;
    cin>>a>>b>>c>>d;
      e=b*d;
      f=(a*d)+(b*c);
      cout<<f<<"/"<<e<<endl;
}

其实这个简单的代码就能达到你要的目的:
   编写一程序计算两个整分数的和。程序运行结果应具有如下形式:
   输入第一个分数:1/2
   输入第二个分数:2/5
   两分数的和为:9/10
#10
csy198811222008-10-29 18:44
要是想化简,就在后面加一个取公约数的代码。
#11
tfg01162008-10-29 22:31
#include<iostream>
using namespace std;

class Fract
{
    int num;
    int den;
public:
        Fract(int a = 0, int b = 1)
        {
            num = a;
            den = b;
        }
    int gcd(int m, int n)
    {
        int r;
        if(m < n)
        {
            r = m;
            m = n;
            n = r;
        }
        while(r = m%n)
        {
            m = n;
            n = r;
        }
        return n;
    }
    Fract add(Fract f);
    void show()
    {
        cout<<num<<"/"<<den<<endl;
    }
};
Fract Fract::add(Fract f)
{
    Fract sum;
    sum.den = den * f.den;
    sum.num = f.den*num + den*f.num;
    int x = gcd(sum.num, sum.den);
    sum.num = sum.num/x;
    sum.den = sum.den/x;
    return sum;
}
void main()
{
    int x , y, i, j;
    cout<<"Enter x , y, i, j:"<<endl;
    cin>>x>>y>>i>>j;
    Fract f1(x, y), f2(i, j), f3;
    f3 = f1.add(f2);
    f3.show();
}
#12
nwpu0634172008-10-29 23:29
通分
#13
yi1572008-10-30 16:45
[bo][un]csy19881122[/un] 在 2008-10-29 18:44 的发言:[/bo]

要是想化简,就在后面加一个取公约数的代码。

嗯, 谢了
#14
yi1572008-10-30 16:47
[bo][un]tfg0116[/un] 在 2008-10-29 22:31 的发言:[/bo]

#include<iostream>
using namespace std;

class Fract
{
    int num;
    int den;
public:
        Fract(int a = 0, int b = 1)
        {
            num = a;
            den = b;
        }
    int gcd(int m, int n)
    {
        int r;
        if(m < n)
        {
            r = m;
            m = n;
            n = r;
        }
        while(r = m%n)
        {
            m = n;
            n = r;
        }
        return n;
    }
    Fract add(Fract f);
    void show()
    {
        cout<<num<<"/"<<den<<endl;
    }
};
Fract Fract::add(Fract f)
{
    Fract sum;
    sum.den = den * f.den;
    sum.num = f.den*num + den*f.num;
    int x = gcd(sum.num, sum.den);
    sum.num = sum.num/x;
    sum.den = sum.den/x;
    return sum;
}
void main()
{
    int x , y, i, j;
    cout<<"Enter x , y, i, j:"<<endl;
    cin>>x>>y>>i>>j;
    Fract f1(x, y), f2(i, j), f3;
    f3 = f1.add(f2);
    f3.show();
}


很好的
1