Условие
Наверно, вы уже слышали об операции «унарный минус». Это операция, которая позволяет значение x превратить в значение −x, то есть это такой знак минус, у которого не два аргумента, а один.
Перегрузите операцию «унарный минус» для класса Fraction. С помощью перегруженной операции выведите введённую дробь xy, но с обратным знаком.
---------------------------------------------------------------------------------------------------------------------------------
Формат входных данных
В первой и единственной строке вводятся два целых числа x и y, разделенные символом «/» (∣∣x∣∣,∣∣y∣∣≤109, y≠0).
---------------------------------------------------------------------------------------------------------------------------------
Формат выходных данных
Выведите числитель и знаменатель через символ «/». Дробь сокращать не обязательно (но можно). Числитель и знаменатель дроби не должны превышать 2⋅1018 по абсолютному значению.
----------------------------------------------------------------------------------------------------------------------------------
Примеры:
входные данныевыходные данные
2/3 | -2/3
1/-2 | -1/-2
Другие языки программирования и технологии
Помогите, пожалуйста, решить задачу на c++.
-1/-2 == 1/2 // мы уже это обсуждали
Кроме всего прочего для решения предыдущих заданий уже были выполнены все необходимые перегрузки и унарный минус в том числе))
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Fraction {
public:
using value_type = long long;
Fraction(const string& str) {
val = split(str, '/');
normalize();
}
string value() {
return to_string(val.first) + '/' + to_string(val.second);
}
Fraction absolute()const {
return Fraction(abs(val.first), val.second);
}
Fraction& operator-() {
val.first *= -1;
return *this;
}
private:
Fraction(value_type a, value_type b) : val{ a, b } {
normalize();
}
pair<value_type, value_type> 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<value_type, value_type> 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<value_type, value_type> split(const string& str, char delim) {
stringstream ss(str);
string token;
pair<value_type, value_type> box;
getline(ss, token, delim);
box.first = stoll(token);
getline(ss, token);
box.second = stoll(token);
return box;
}
friend Fraction operator-(const Fraction& a, const Fraction& 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 Fraction(to_string(abn) + '/' + to_string(abd));
}
friend bool operator<(const Fraction& a, const Fraction& b) {
return double(a.val.first) / a.val.second < double(b.val.first) / b.val.second;
}
friend bool operator<(const Fraction& a, const double b) {
return double(a.val.first) / a.val.second < b;
}
friend bool operator==(const Fraction& a, const Fraction& b) {
return a.val.first == b.val.first && a.val.second == b.val.second;
}
friend bool operator==(const Fraction& a, const double b) {
return double(a.val.first) / a.val.second == b;
}
friend bool operator>(const Fraction& a, const Fraction& b) {
return double(a.val.first) / a.val.second > double(b.val.first) / b.val.second;
}
friend bool operator>(const Fraction& a, const double b) {
return double(a.val.first) / a.val.second > b;
}
friend Fraction operator%(const Fraction& a, const Fraction& b) {
auto xa = a.absolute();
auto xb = b.absolute();
if (xa < xb) return a;
auto x = xa - xb;
if (x == 0) return Fraction(0, 1);
while (x > xb) x = x - xb;
return a.val.first > 0? x : -x;
}
friend Fraction operator*(const Fraction& a, const Fraction& b) {
return Fraction(a.val.first * b.val.first, a.val.second * b.val.second);
}
friend Fraction operator/(const Fraction& a, const Fraction& b) {
return Fraction(a.val.first * b.val.second, a.val.second * b.val.first);
}
};
int main() {
string a;
cin >> a;
Fraction fa(a);
cout << (-fa).value() << '\n';
string b;
cin >> b;
Fraction fb(b);
cout << (-fb).value() << '\n';
system("pause > nul");
}
Кроме всего прочего для решения предыдущих заданий уже были выполнены все необходимые перегрузки и унарный минус в том числе))
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Fraction {
public:
using value_type = long long;
Fraction(const string& str) {
val = split(str, '/');
normalize();
}
string value() {
return to_string(val.first) + '/' + to_string(val.second);
}
Fraction absolute()const {
return Fraction(abs(val.first), val.second);
}
Fraction& operator-() {
val.first *= -1;
return *this;
}
private:
Fraction(value_type a, value_type b) : val{ a, b } {
normalize();
}
pair<value_type, value_type> 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<value_type, value_type> 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<value_type, value_type> split(const string& str, char delim) {
stringstream ss(str);
string token;
pair<value_type, value_type> box;
getline(ss, token, delim);
box.first = stoll(token);
getline(ss, token);
box.second = stoll(token);
return box;
}
friend Fraction operator-(const Fraction& a, const Fraction& 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 Fraction(to_string(abn) + '/' + to_string(abd));
}
friend bool operator<(const Fraction& a, const Fraction& b) {
return double(a.val.first) / a.val.second < double(b.val.first) / b.val.second;
}
friend bool operator<(const Fraction& a, const double b) {
return double(a.val.first) / a.val.second < b;
}
friend bool operator==(const Fraction& a, const Fraction& b) {
return a.val.first == b.val.first && a.val.second == b.val.second;
}
friend bool operator==(const Fraction& a, const double b) {
return double(a.val.first) / a.val.second == b;
}
friend bool operator>(const Fraction& a, const Fraction& b) {
return double(a.val.first) / a.val.second > double(b.val.first) / b.val.second;
}
friend bool operator>(const Fraction& a, const double b) {
return double(a.val.first) / a.val.second > b;
}
friend Fraction operator%(const Fraction& a, const Fraction& b) {
auto xa = a.absolute();
auto xb = b.absolute();
if (xa < xb) return a;
auto x = xa - xb;
if (x == 0) return Fraction(0, 1);
while (x > xb) x = x - xb;
return a.val.first > 0? x : -x;
}
friend Fraction operator*(const Fraction& a, const Fraction& b) {
return Fraction(a.val.first * b.val.first, a.val.second * b.val.second);
}
friend Fraction operator/(const Fraction& a, const Fraction& b) {
return Fraction(a.val.first * b.val.second, a.val.second * b.val.first);
}
};
int main() {
string a;
cin >> a;
Fraction fa(a);
cout << (-fa).value() << '\n';
string b;
cin >> b;
Fraction fb(b);
cout << (-fb).value() << '\n';
system("pause > nul");
}
Похожие вопросы
- Помогите, пожалуйста, решить задачу в c++!!
- Помогите пожалуйста решить задачу на C.
- Помогите пожалуйста решить задачу в c++!!
- Помогите пожалуйста решить на языке C++
- помогите пожалуйста решить задачу по работе компьютера!
- Програмрование C# .Помогите пожалуйста решить задачу . Бьюсь головой об экран уже ...
- Помогите, пожалуйста, решить задачу на языке C++
- Помогите пожалуйста решить задачу по программированию. В чем я ошибаюсь?
- Помогите,пожалуйста,решить задачу в Паскале.
- Pascal. Помогите пожалуйста решить задачу в паскале !