Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Operacje logiczne na dużych liczbach

Ostatnio zmodyfikowano 2017-03-18 22:35
Autor Wiadomość
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ć.
C/C++
#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;
}
P-159125
pekfos
» 2017-03-18 21:09:39
C/C++
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.
P-159128
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.
P-159133
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.
P-159135
« 1 »
  Strona 1 z 1