求以下问题的完整代码

求以下问题的完整代码,要求使用c++面向对象程序设计方法,使用构造函数和析构函数

img

求公约数和公倍数的时候需要用long long类型,否则可能会导致越界,运行结果:

img

代码

#include <iostream>
using namespace std;


class Caculate
{
private:
    int* mFz;  //保存所有分子
    int* mFm; //保存所有分母
    int mNmb; //保存个数
    int sumFz; //结果的分子
    int sumFm; //结果的分母
public:
    Caculate(int n, int* fz, int* fm)
    {
        mFz = new int[n];
        mFm = new int[n];
        for (int i = 0; i < n; i++)
        {
            mFz[i] = fz[i];
            mFm[i] = fm[i];
        }
        mNmb = n;
    }
    ~Caculate()
    {
        if (mFz != 0)
            delete[] mFz;
        if (mFm != 0)
            delete[] mFm;
        mFz = 0;
        mFm = 0;
    }
    //求公约数
    int gys(long long a, long long b)
    {
        long long  i = a > b ? b : a;
        for (; i >= 1; i--)
        {
            if (a % i == 0 && b % i == 0)
                return i;
        }
        return 1;
    }
    //求公倍数
    long long gbs(long long a, long long b)
    {
        long long s = a * b;
        return s / gys(a, b);
    }
    //求和
    void sum()
    {
        sumFz = mFz[0];
        sumFm = mFm[0];

        //分子、分母最简,避免输入2/6这样的数据导致最后的结果不是最简的问题
        long long x = gys(sumFz, sumFm);
        sumFz /= x;
        sumFm /= x;

        for (int i = 1; i < mNmb; i++)
        {
            long long fm = gbs(sumFm, mFm[i]); //求分母的最小公倍数,新的分母
            long long fz = sumFz * (fm / sumFm) + mFz[i] * (fm / mFm[i]); //新的分子

            //化简,求分子、分母的最大公约数
            long long gy = gys(fz, fm);
            sumFz = fz/gy;
            sumFm = fm/gy;
        }
        cout << sumFz << "/" << sumFm;
    }
    
};



int main()
{
    int n;
    int a[12], b[12];
    char c;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i] >> c >> b[i];
    }
    Caculate cc(n, a, b);
    cc.sum();
    return 0;
}


这个需求用类,真是别扭啊

直接上代码:

#include <iostream>
#include <cstring>
using namespace std;

int gcd(int a, int b) {  // 计算两个整数的最大公约数
    if (b == 0) return a;
    return gcd(b, a % b);
}

int main() {
    int n;
    cin >> n;

    int sum_up = 0, sum_down = 1;  // 分别保存分数和的分子和分母

    for (int i = 0; i < n; i++) {
        int a, b;
        char c;
        cin >> a >> c >> b;
        int g = gcd(abs(a), b);  // 分子分母取绝对值再计算最大公约数
        a /= g;
        b /= g;
        sum_up = sum_up * b + sum_down * a;
        sum_down *= b;
        g = gcd(abs(sum_up), sum_down);  // 分子分母取绝对值再计算最大公约数
        sum_up /= g;
        sum_down /= g;
    }

    if (sum_down == 1) {  // 最终结果的分母为1
        cout << sum_up << endl;
    } else if (sum_down > 1) {  // 最终结果的分母不为1,需要输出分数
        int integer_part = sum_up / sum_down;  // 整数部分
        sum_up -= integer_part * sum_down;
        int g = gcd(abs(sum_up), sum_down);  // 分子分母取绝对值再计算最大公约数
        sum_up /= g;
        sum_down /= g;
        if (integer_part != 0) {
            cout << integer_part << " ";
        }
        cout << sum_up << "/" << sum_down << endl;
    } else {  // 分母为0,无法计算
        cout << "error" << endl;
    }

    return 0;
}


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632