求以下问题的完整代码,要求使用c++面向对象程序设计方法,使用构造函数和析构函数
求公约数和公倍数的时候需要用long long类型,否则可能会导致越界,运行结果:
代码
#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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!1.若二数a,n互质,则有
2. (这里mod表示C语言中的‘%’。CSDN的公式编辑器打不出来。)
证明:http://www.cnblogs.com/maijing/p/5046628.html