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

Duże liczby

Ostatnio zmodyfikowano 2017-06-16 14:55
Autor Wiadomość
bartinio07
Temat założony przez niniejszego użytkownika
Duże liczby
» 2017-06-14 16:53:33
Witam, mam problem z następującym zadaniem:
Wiemy już, że każdy typ całkowity w języku C++ ma pewien ograniczony zakres. W tym zadaniu będziemy
jednak operować na liczbach przekraczających zakresy wszystkich typów! Twoim zadaniem jest napisanie
programu, który będzie porównywał takie bardzo duże liczby. Jak sobie z tym poradzisz?. . .

Wejście
Wejście składa się tylko z jednego wiersza, zawierającego kolejno: liczbę naturalną a, odstęp, znaki porównania,
odstęp i liczbę naturalną b (1 ≤ a, b ≤ 101000). Możliwe znaki porównania to: ==, !=, <, >, <= lub >=.

Wyjście
Twój program powinien wypisać jedno słowo TAK lub NIE, oznaczające, czy nierówność podana na wejściu jest
prawdziwa, czy fałszywa.

Przykład
Dla danych wejściowych:
1000000000000000000000000000000 < 1000000000000000000000000000001
poprawnym wynikiem jest:
TAK

natomiast dla danych wejściowych:
999 >= 20000
poprawnym wynikiem jest:
NIE

Napisałem już coś takiego:
C/C++
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string a, b, znak;
    cin >> a >> znak >> b;
   
    if( a.length() > b.length() && znak == ">" || znak == ">=" || znak == "!=" )
         cout << "TAK";
    else if( a.length() < b.length() && znak == "<" || znak == "<=" || znak == "!=" )
         cout << "TAK";
    else
         cout << "NIE";
   
    if( a.length() == b.length() )
    {
        int c = a.length(), d = b.length();
       
        for( int i = 0; i <= c; i++ )
        {
            for( int j = 0; j <= d; j++ )
            {
                if( a[ i ] > b[ j ] && znak == ">" || znak == ">=" || znak == "!=" )
                     cout << "TAK";
               
                break;
                if( a[ i ] < b[ j ] && znak == "<" || znak == "<=" || znak == "!=" )
                     cout << "TAK";
               
                break;
                if( a[ i ] == b[ j ] && znak == "==" )
                     cout << "TAK";
                else
                     cout << "NIE";
               
            }
        }
    }
   
    return 0;
   
}
Program jednak nie działa do końca poprawnie. Mógłby ktoś podpowiedzieć, co trzeba w nim zmienić/dodać, żeby było ok?
P-162540
Luq
» 2017-06-14 18:18:37
Na pierwszy rzut oka brakuje Ci nawiasów w ifach

if( a.length() > b.length() &&( znak == ">" || znak == ">=" || znak == "!=" ) )
P-162546
bartinio07
Temat założony przez niniejszego użytkownika
» 2017-06-14 18:25:00
Dopisałem nawiasy, ale nadal podaje złe wyniki.
P-162548
mateczek
» 2017-06-14 18:50:07
P-162550
bartinio07
Temat założony przez niniejszego użytkownika
» 2017-06-14 19:44:53
?
P-162553
michal11
» 2017-06-14 20:46:14
Bez sensu jest ten podwójny for, przecież jeżeli masz dwie liczby które mają tyle samo znaków to wystarczy sprawdzić która liczba ma większą pierwszą od lewej cyfrę, jeżeli są równe to wtedy drugą od lewej itd. jeżeli doszedłeś do końca to znaczy, że liczby są równe. Skoro liczby mają taką samą długość to wystarczy jeden for.
P-162555
bartinio07
Temat założony przez niniejszego użytkownika
» 2017-06-14 21:05:42
Podpowiedziałbyś, jak to zapisać w jednej pętli?
P-162556
mateczek
» 2017-06-14 21:28:28
Zobacz taki kod i pobaw się w ten sposób
C/C++
#include <iostream>
#include<string>
using namespace std;
int main()
{
    string a = "1212", b = "2213", znak = ">";
    int diff = a.size() - b.size();
    if( diff < 0 ) {
        a.insert( a.begin(), - diff, '0' ); //uzupełnianie zerami do równej długości
    } else if( diff > 0 ) {
        b.insert( b.begin(), diff, '0' );
    }
   
   
    if(( znak == "==" || znak == ">=" || znak == "<=" ) &&( a == b ) ) {
        cout << "TAK" << endl;
    } else if(( znak == ">" || znak == ">=" ) &&( a > b ) ) {
        cout << "TAK" << endl;
    } else if(( znak == "<" || znak == "<=" ) &&( a < b ) ) {
        cout << "TAK" << endl;
    } else
         cout << "NIE" << endl;
   
}
P-162558
« 1 » 2 3
  Strona 1 z 3 Następna strona