Atsu Temat założony przez niniejszego użytkownika |
Operacje logiczne na dużych liczbach » 2017-03-18 20:08:21 Hej, zadanie wygląda mniej więcej tak: Na wejście podawane są są dwie liczby i znak działania logicznego oddzielone spacją(np. 1001 >= 1002), wprowadzane liczby są w zakresie 1<=a,b<=10^1000. System wyrzuca mi 8 błędów na 98 prób(program podaje TAK gdy powinno być NIE), nie mam pojęcia z jakiego powodu. Może ktoś coś podrzuci, byłbym wdzięczny. Kod jest dość przejrzysty więc chyba łatwo się połapać. #include <iostream> #include <string> #include <string.h> #include <ctype.h> #include <stdlib.h> #include <algorithm> #include <math.h> using namespace std;
bool equ( string a, string b ) { if( a == b ) return true; else return false; } bool neq( string a, string b ) { if( a != b ) return true; else return false; } bool leq( string a, string b ) { char g; char h; if( a.size() < b.size() ) return true; if( a.size() > b.size() ) return false; if( a == b ) return true; for( int i = 0; i < a.size(); i++ ) { g = a[ i ]; h = b[ i ]; if( g - 48 < h - 48 ) return true; } return false; } bool geq( string a, string b ) { char g; char h; if( a.size() > b.size() ) return true; if( a.size() < b.size() ) return false; if( a == b ) return true; for( int i = 0; i < a.size(); i++ ) { g = a[ i ]; h = b[ i ]; if( g - 48 > h - 48 ) return true; } return false; } bool les( string a, string b ) { char g; char h; if( a.size() < b.size() ) return true; if( a.size() > b.size() ) return false; for( int i = 0; i < a.size(); i++ ) { g = a[ i ]; h = b[ i ]; if( g - 48 < h - 48 ) return true; } return false; } bool gre( string a, string b ) { char g; char h; if( a.size() > b.size() ) return true; if( a.size() < b.size() ) return false; for( int i = 0; i < a.size(); i++ ) { g = a[ i ]; h = b[ i ]; if( g - 48 > h - 48 ) return true; } return false; } int main() { string a; string b; string c; cin >> a; cin >> c; cin >> b; if( c == "==" ) { if( equ( a, b ) ) cout << "TAK"; else cout << "NIE"; } if( c == "!=" ) { if( neq( a, b ) ) cout << "TAK"; else cout << "NIE"; } if( c == "<=" ) { if( leq( a, b ) ) cout << "TAK"; else cout << "NIE"; } if( c == ">=" ) { if( geq( a, b ) ) cout << "TAK"; else cout << "NIE"; } if( c == "<" ) { if( les( a, b ) ) cout << "TAK"; else cout << "NIE"; } if( c == ">" ) { if( gre( a, b ) ) cout << "TAK"; else cout << "NIE"; } return 0; }
|
|
pekfos |
» 2017-03-18 21:09:39 for( int i = 0; i < a.size(); i++ ) { g = a[ i ]; h = b[ i ]; if( g - 48 < h - 48 ) return true; } |
Jak sprawdzasz, czy A < B, to idąc od najstarszych cyfr, sprawdzasz a < b i zwracasz prawdę, jeśli warunek zachodzi. Ale jeśli nie zachodzi, to albo a = b (ok), albo a > b, co oznacza, że A > B, a więc A < B jest fałszywe. Ten przypadek zignorowałeś. W zasadzie powinieneś mieć jedną funkcję, która określa relację miedzy dwoma liczbami i zwraca -1, 0, lub 1 (signum różnicy dwóch liczb), a faktyczne >=, >, ==, itd stosujesz na zwróconym wyniku. |
|
Atsu Temat założony przez niniejszego użytkownika |
» 2017-03-18 22:10:31 Kurcze, rzeczywiście, chyba jeszcze dobrze nie wytrzeźwiałem, że nie wychwyciłem tego wcześniej Rzeczywiście, takie rozwiązanie wyglądałoby lepiej, chociaż z drugiej strony ważne, że działa :P Dzięki za pomoc ; ) edit; Wait, wait, wait, jakie signum? Jeśli dobrze cię rozumiem to chcesz porównywać wartości signum tych liczb, a to są tylko 3 stany(>0,=0,<0), a tu chodzi o porównywanie samych liczb. |
|
pekfos |
» 2017-03-18 22:35:32 Signum różnicy liczb. Nie musisz ich faktycznie odejmować, tak po prostu łatwiej było opisać działanie. Zamiast robić A>B, robisz A-B>0. |
|
« 1 » |