7-35 有理數均值 (20 分)
阿新 • • 發佈:2018-12-11
7-35 有理數均值 (20 分)
本題要求編寫程式,計算N個有理數的平均值。
輸入格式:
輸入第一行給出正整數N(≤100);第二行中按照a1/b1 a2/b2 …
的格式給出N個分數形式的有理數,其中分子和分母全是整形範圍內的整數;如果是負數,則負號一定出現在最前面。
輸出格式:
在一行中按照a/b
的格式輸出N個有理數的平均值。注意必須是該有理數的最簡分數形式,若分母為1,則只輸出分子。
輸入樣例1:
4
1/2 1/6 3/6 -5/10
輸出樣例1:
1/6
輸入樣例2:
2
4/3 2/3
輸出樣例2:
1
#include <iostream> #include <sstream> #include <string> using namespace std; class Fraction { public: Fraction(string frac) { if (frac[0] == '-') { isPositive = -1; frac = frac.substr(1, frac.length()); } else isPositive = 1; int idx = frac.find('/'); if (idx != frac.npos) { StrToNum(frac.substr(0, idx), Numerator); StrToNum(frac.substr(idx + 1, frac.length()), Denominator); } else { StrToNum(frac, Numerator); Denominator = 1; } } Fraction(long Numerator, long Denominator, int isPositive) { this->Numerator = Numerator; this->Denominator = Denominator; this->isPositive = isPositive; } Fraction add(Fraction other) { long newNumerator = isPositive * Numerator * other.getDeDenominator() + other.getPositive() * other.getNumerator() * Denominator; int tempPostive = 1; if (newNumerator < 0) { tempPostive = -1; newNumerator = -newNumerator; } long newDenominator = Denominator * other.getDeDenominator(); long tempGcd = gcd(newNumerator, newDenominator); return Fraction(newNumerator / tempGcd, newDenominator / tempGcd, tempPostive); } long gcd(long a, long b) { return b == 0 ? a : gcd(b, a % b); } void printAverageFraction(int n) { Denominator = Denominator *n; long tempGcd = gcd(Numerator, Denominator); Denominator = Denominator / tempGcd; Numerator = Numerator / tempGcd; if (isPositive < 0) cout << '-'; cout << Numerator; if (Denominator != 1) cout << '/' << Denominator; } void StrToNum(const string& s, long& n){ istringstream iss(s); iss >> n; } long getNumerator() { return Numerator; } long getDeDenominator() { return Denominator; } long getPositive() { return isPositive; } private: long Numerator; long Denominator; long isPositive; }; int main() { int count; string number, temp_number; cin >> count; cin >> number; Fraction total(number); for (int i = 0; i < count-1; i++) { cin >> temp_number; Fraction temp_total(temp_number); total = total.add(temp_total); //total.printFraction(); } total.printAverageFraction(count); return 0; }