Условие
Даны дроби a, b, c и d.
Вычислите значение выражения
d^2−3a/(b⋅c).
При решении этой задачи перегрузите у класса Fraction все необходимые арифметические операции и операции ввода/вывода, удалив методы show() и read().
Формат входных данных
С клавиатуры вводятся четыре дроби, каждая в своей строке. Числитель и знаменатель дроби разделяются символом «/». Все числа, вводимые во входных данных не превышают 1000 по абсолютной величине, а также не равны 0.
Формат выходных данных
Выведите числитель и знаменатель дроби, получившейся при вычислении выражения, через символ «/». Дробь сокращать не обязательно (но можно). Числитель и знаменатель дроби не должны превышать 2⋅1018 по абсолютному значению.
Примечания
Каждая дробь представляется в виде x1∕x2. Поэтому результирующее выражение при вычислении преобразуется в следующее:
d2−3⋅ab⋅c=d1/d2⋅d1/d2−3⋅a1/a2/(b1/b2⋅c1/c2)
--------------------------------------------------------------------------------------------------------------------------------
Примеры:
входные данныевыходные данные
9/7
12/11
16/9
-2/3 | -6227/4032
1/1
1/1
1/1
1/1 | -2/1
C/C++
Помогите решить задачу C++
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Frac {
public:
using value_type = long long;
Frac() : val({0, 1}) {}
Frac(const string& str) {
val = split(str, '/');
normalize();
}
string value()const { return to_string(val.first) + '/' + to_string(val.second); }
Frac absolute()const { return Frac(abs(val.first), val.second); }
Frac& operator-() {
val.first *= -1;
return *this;
}
private:
Frac(value_type a, value_type b) : val{ a, b } { normalize(); }
pair val;
void normalize() {
auto x = gcd(val);
if (x) {
val.first /= x;
val.second /= x;
if (val.second < 0) {
val.first *= -1;
val.second *= -1;
}
}
}
value_type gcd(pair v) {
v.first = abs(v.first);
if (v.first) {
v.second = abs(v.second);
while (v.first != v.second) {
if (v.first > v.second) swap(v.first, v.second);
v.second -= v.first;
}
}
return v.first;
}
pair split(const string& str, char delim) {
stringstream ss(str);
string token;
pair box;
getline(ss, token, delim);
box.first = stoll(token);
getline(ss, token);
box.second = stoll(token);
return box;
}
friend Frac operator-(const Frac& a, const Frac& b) {
const auto an = a.val.first * b.val.second;
const auto bn = b.val.first * a.val.second;
const auto abn = an - bn;
const auto abd = a.val.second * b.val.second;
return Frac(to_string(abn) + '/' + to_string(abd));
}
friend bool operator<(const Frac& a, const Frac& b) { return double(a.val.first) / a.val.second < double(b.val.first) / b.val.second; }
friend bool operator<(const Frac& a, const double b) { return double(a.val.first) / a.val.second < b; }
friend bool operator==(const Frac& a, const Frac& b) { return a.val.first == b.val.first && a.val.second == b.val.second; }
friend bool operator==(const Frac& a, const double b) { return double(a.val.first) / a.val.second == b; }
friend bool operator>(const Frac& a, const Frac& b) { return double(a.val.first) / a.val.second > double(b.val.first) / b.val.second; }
friend bool operator>(const Frac& a, const double b) { return double(a.val.first) / a.val.second > b; }
friend Frac operator%(const Frac& a, const Frac& b) {
auto xa = a.absolute();
auto xb = b.absolute();
if (xa < xb) return a;
auto x = xa - xb;
if (x == 0) return Frac(0, 1);
while (x > xb) x = x - xb;
return a.val.first > 0? x : -x;
}
friend Frac operator*(const Frac& a, const value_type b) { return Frac(a.val.first * b, a.val.second); }
friend Frac operator*(const value_type a, const Frac& b) { return Frac(b.val.first * a, b.val.second); }
friend Frac operator*(const Frac& a, const Frac& b) { return Frac(a.val.first * b.val.first, a.val.second * b.val.second); }
friend Frac operator/(const Frac& a, const Frac& b) { return Frac(a.val.first * b.val.second, a.val.second * b.val.first); }
friend Frac operator+(const Frac& a, const Frac& b) {
auto d = a.val.second * b.val.second;
auto n = a.val.first * b.val.second + b.val.first * a.val.second;
return Frac(n, d);
}
friend Frac operator+(const Frac& a, const value_type b) {
auto d = a.val.second;
auto n = a.val.first + b * a.val.second;
return Frac(n, d);
}
friend Frac operator+(const value_type b, const Frac& a) {
auto d = a.val.second;
auto n = a.val.first + b * a.val.second;
return Frac(n, d);
}
friend ostream& operator<<(ostream& out, const Frac& fr) { return out << fr.val.first << '/' << fr.val.second; }
friend istream& operator>>(istream& inp, Frac& fr) {
string str;
inp >> str;
fr.val = fr.split(str, '/');
fr.normalize();
return inp;
}
};
int main() {
Frac a, b, c, d;
cin >> a >> b >> c >> d;
auto x = d * d - 3 * a / (b * c);
cout << x << '\n';
system("pause > nul");
}
#include <string>
#include <sstream>
using namespace std;
class Frac {
public:
using value_type = long long;
Frac() : val({0, 1}) {}
Frac(const string& str) {
val = split(str, '/');
normalize();
}
string value()const { return to_string(val.first) + '/' + to_string(val.second); }
Frac absolute()const { return Frac(abs(val.first), val.second); }
Frac& operator-() {
val.first *= -1;
return *this;
}
private:
Frac(value_type a, value_type b) : val{ a, b } { normalize(); }
pair val;
void normalize() {
auto x = gcd(val);
if (x) {
val.first /= x;
val.second /= x;
if (val.second < 0) {
val.first *= -1;
val.second *= -1;
}
}
}
value_type gcd(pair v) {
v.first = abs(v.first);
if (v.first) {
v.second = abs(v.second);
while (v.first != v.second) {
if (v.first > v.second) swap(v.first, v.second);
v.second -= v.first;
}
}
return v.first;
}
pair split(const string& str, char delim) {
stringstream ss(str);
string token;
pair box;
getline(ss, token, delim);
box.first = stoll(token);
getline(ss, token);
box.second = stoll(token);
return box;
}
friend Frac operator-(const Frac& a, const Frac& b) {
const auto an = a.val.first * b.val.second;
const auto bn = b.val.first * a.val.second;
const auto abn = an - bn;
const auto abd = a.val.second * b.val.second;
return Frac(to_string(abn) + '/' + to_string(abd));
}
friend bool operator<(const Frac& a, const Frac& b) { return double(a.val.first) / a.val.second < double(b.val.first) / b.val.second; }
friend bool operator<(const Frac& a, const double b) { return double(a.val.first) / a.val.second < b; }
friend bool operator==(const Frac& a, const Frac& b) { return a.val.first == b.val.first && a.val.second == b.val.second; }
friend bool operator==(const Frac& a, const double b) { return double(a.val.first) / a.val.second == b; }
friend bool operator>(const Frac& a, const Frac& b) { return double(a.val.first) / a.val.second > double(b.val.first) / b.val.second; }
friend bool operator>(const Frac& a, const double b) { return double(a.val.first) / a.val.second > b; }
friend Frac operator%(const Frac& a, const Frac& b) {
auto xa = a.absolute();
auto xb = b.absolute();
if (xa < xb) return a;
auto x = xa - xb;
if (x == 0) return Frac(0, 1);
while (x > xb) x = x - xb;
return a.val.first > 0? x : -x;
}
friend Frac operator*(const Frac& a, const value_type b) { return Frac(a.val.first * b, a.val.second); }
friend Frac operator*(const value_type a, const Frac& b) { return Frac(b.val.first * a, b.val.second); }
friend Frac operator*(const Frac& a, const Frac& b) { return Frac(a.val.first * b.val.first, a.val.second * b.val.second); }
friend Frac operator/(const Frac& a, const Frac& b) { return Frac(a.val.first * b.val.second, a.val.second * b.val.first); }
friend Frac operator+(const Frac& a, const Frac& b) {
auto d = a.val.second * b.val.second;
auto n = a.val.first * b.val.second + b.val.first * a.val.second;
return Frac(n, d);
}
friend Frac operator+(const Frac& a, const value_type b) {
auto d = a.val.second;
auto n = a.val.first + b * a.val.second;
return Frac(n, d);
}
friend Frac operator+(const value_type b, const Frac& a) {
auto d = a.val.second;
auto n = a.val.first + b * a.val.second;
return Frac(n, d);
}
friend ostream& operator<<(ostream& out, const Frac& fr) { return out << fr.val.first << '/' << fr.val.second; }
friend istream& operator>>(istream& inp, Frac& fr) {
string str;
inp >> str;
fr.val = fr.split(str, '/');
fr.normalize();
return inp;
}
};
int main() {
Frac a, b, c, d;
cin >> a >> b >> c >> d;
auto x = d * d - 3 * a / (b * c);
cout << x << '\n';
system("pause > nul");
}
Философия С++ Эккель
Похожие вопросы
- Помогите решить задачу, c++, функции
- Помогите решить задачу c++
- Помогите решить задачу C++
- Помогите решить задачу C++, пожалуйста.
- Помогите решить задачу C++
- Помогите решить задачу C++
- Помогите решить задачу . C++
- Пожалуйста, помогите решить задачу! C++
- Помогите решить задачу по программированию на C++
- Помогите решить задачу по C++!
000000.cpp:21:1: error: invalid use of template-name 'std::pair' without an argument list
pair val;
^~~~
000000.cpp:21:1: note: class template argument deduction is only available with -std=c++17 or -std=gnu++17
In file included from /usr/include/c++/8/bits/stl_algobase.h:64,
from /usr/include/c++/8/bits/char_traits.h:39,
from /usr/include/c++/8/ios:40,
from /usr/include/c++/8/ostream:38,
from /usr/include/c++/8/iostream:39,
from 000000.cpp:1:
/usr/include/c++/8/bits/stl_pair.h:208:12: note: 'template struct std::pair' declared here
struct pair
^~~~
огромная ошибка, всю не могу прислать ((,в чём может быть пробелма?