Задача: сортировка рациональных дробей
Входные данные
Программа получает на вход n дробей: сначала задается число n ,
потом идет n строк, в каждой из которых записана одна дробь.
Дробь записана в виде a/b , где a и b — натуральные числа.
Выходные данные
Программа должна вывести список этих дробей в порядке неубывания.
Если в списке есть две равные дроби то раньше выводится дробь, у которой меньше числитель.
ПРИМЕР
ввод
3
4/2
2/6
1/2
вывод
2/6
1/2
4/2
Вот моё решение , но оно не проходит тесты и идей почему - нет
struct Point {
string a;
double b;
};
struct Point {
string a;
double b;
};
bool comp(Point a , Point b) {
if(a.b == b.b) {
ll cur1 = 0;
ll cur2 = 0;
for(int i = 0; i < a.a.size();i++) {
if(a.a[i] == '/') {
break;
}
cur1+= (a.a[i]-48)*10;
}
for(int i =0 ; i < b.a.size();i++) {
if(b.a[i] == '/') {
break;
}
cur2+= (b.a[i]-48)*10;
}
return cur1 < cur2;
}
return a.b < b.b;
}
int main() {
int n;
cin >> n;
vector<Point> a(n);
for(int i =0 ;i < n;i++) {
string s;
int f,l;
scanf("%d/%d" , &f , &l);
s = to_string(f) +"/" + to_string(l);
a[i].a = s;
double ff = f;
double l2 = l;
double res = ff/l2;
a[i].b = res;
}
sort(a.begin(),a.end(),comp);
for(auto x : a) {
cout << x.a << endl;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ну попробуйте это:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct ratio
{
int q,d;
};
bool operator < (const ratio& a, const ratio& b)
{
int q = a.q*b.d, d = a.d*b.q;
if (q < d) return true;
if (q > d) return false;
return a.d < b.d;
}
istream& operator >> (istream& is, ratio& r)
{
char c;
is >> r.q >> c >> r.d;
return is;
};
int main()
{
vector<ratio> v;
int N;
cin >> N;
for(int i = 0; i < N; ++i)
{
ratio r;
cin >> r;
v.push_back(r);
}
sort(v.begin(),v.end());
for(auto r: v)
cout << r.q << "/" << r.d << endl;
}