• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z porównywaniem dużych liczb w c++.

0 głosów
1,699 wizyt
pytanie zadane 9 kwietnia 2017 w C i C++ przez maciek259 Nowicjusz (240 p.)
edycja 9 kwietnia 2017 przez maciek259

Witam mam problem z 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 ≤ 10^1000). Możliwe znaki porównania to: ==, !=, >, <, >=,<=.

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.

Po paru próbach i błędach skonstruowałem ten kod, ale nadal internetowa testerka znajduje 8 błędów na ok. 100 testów. Normalnie próbowałbym dalej metodą prób i błędów, ale jestem dość bliski limitu tych prób do zaliczenia kursu na mainie2. Byłbym naprawdę wdzięczny, gdyby ktoś przynajmniej napisał mi czy te błędy spowodowane są błędami w kodzie czy błędami w rozumowaniu.

#include<iostream>
#include<string>
using namespace std;

bool rowne(string a, string b)
{
    if(a.length()==b.length()){
        for(int i=0;i<a.length();++i)
        {
            if(a[i]!= b[i])
            {
                return false;
            }
        }
        return true;
    }
    else if(a.size()!=b.size()){
        return false;}
}
bool mniejsze(string a, string b){
    int c,d;
if((a.length()<b.length()))
    {
        return true;
    }
    else if(a.length()==b.length()){
        for(int z=0;z<a.length();++z)
        {


            if(a[z]-'0'< b[z]-'0')
            {
                return true;
            }

        }
        return false;
    }
else if(a.length()>b.length())
    return false;
}
int main(){
string znak;
string a;
string b;
bool p=false;
cin>>a>>znak>>b;
int y=0;
int t=0;
while(a[0]=='0'&&a.length()!=1)
{
    a.erase(0,1);

}
while(b[0]=='0'&&b.length()!=1)
{
    b.erase(0,1);

}
if(znak=="=="){
    if(rowne(a,b)==true)
        p=true;
}
else if(znak=="!=")
{
    if(rowne(a,b)!=true)
        p=true;
}
else if(znak=="<"){
    if(mniejsze(a,b))
        p=true;
}
else if(znak==">")
{
    if(mniejsze(b,a))
        p=true;
}
else if(znak=="<="){
if(mniejsze(b,a)!=true)
    p=true;
}

else if(znak==">="){
if(mniejsze(a,b)==false)
    p=true;}

if(p==true)
    cout<<"TAK";
else if(p==false)
    cout<<"NIE";

return 0; }

 

komentarz 9 kwietnia 2017 przez RobertGardzinski Bywalec (2,460 p.)

Po paru próbach i błędach skonstruowałem ten kod, ale nadal internetowa testerka znajduje 8 błędów na ok. 100 testów.

Podaj namiary na internetową testerkę. Co to za błędy? Nie przechodzi 8 testcase'ów? 

komentarz 9 kwietnia 2017 przez maciek259 Nowicjusz (240 p.)
edycja 9 kwietnia 2017 przez maciek259

Ów testerka to https://main2.edu.pl/news/ z kursu wstęp do programowania, zadanie "Duże liczby". Jedyne co wiem o testerce to załączony screen.

komentarz 9 kwietnia 2017 przez RobertGardzinski Bywalec (2,460 p.)

To może dopisz w pierwszym ifie w mainie warunek

if(znak=="==" || znak=="=")

bo w poleceniu widzę, że mają być tylko trzy operatory porównania

komentarz 9 kwietnia 2017 przez maciek259 Nowicjusz (240 p.)
Aj, mój błąd, coś się nie skopiowało. Operatory to: ==, !=, >, <, >=,<=.

1 odpowiedź

0 głosów
odpowiedź 9 kwietnia 2017 przez mokrowski Mędrzec (158,940 p.)
komentarz 9 kwietnia 2017 przez maciek259 Nowicjusz (240 p.)
Spróbowałem, Funkcje porównawcze zaczerpnąłem pod ify i nadal mam 8 błędów(innych od poprzednich). Przekopiowanie całego kodu także nie działa.
1
komentarz 9 kwietnia 2017 przez mokrowski Mędrzec (158,940 p.)
A dokładnie skopiowałeś, ze zrozumieniem? :-)
komentarz 9 kwietnia 2017 przez maciek259 Nowicjusz (240 p.)
Jeśli chodzi o cały kod, to problemem było to, że kod działał tylko jeśli kompiler wspierał ISO C++ 2011 standard, testerka najwidoczniej nie wspiera. W sytuacji przekopiowania tylko instrukcji porównawczych to w argumentach tych funkcji dałem stringi, które zostają wpisane w bloku wejścia. Jeśli już coś miałoby być błędem to prawdopodobnie, te argumenty będące stringami do funkcji, która potrzebuje const stringów. Oczywiście zmieniłem wyjście, na odpowiadające mi "TAK" i "NIE". Jestem początkującym i elementy takie jak tuple, evaluator nie są mi znane i to mogło być moim błędem, lecz podejrzewam, że gdzieś indziej leży ów błąd.

Podobne pytania

0 głosów
3 odpowiedzi 3,737 wizyt
pytanie zadane 15 sierpnia 2016 w C i C++ przez Krzysiek Rojowski Obywatel (1,110 p.)
0 głosów
2 odpowiedzi 3,083 wizyt
pytanie zadane 30 października 2017 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 313 wizyt
pytanie zadane 30 sierpnia 2017 w Java przez LukasHardwares Początkujący (490 p.)

93,604 zapytań

142,528 odpowiedzi

322,995 komentarzy

63,090 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...