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

KC015 - Porównywanie dużych liczb SPOJ

0 głosów
1,573 wizyt
pytanie zadane 21 sierpnia 2018 w SPOJ przez Piotr Błaszczak Bywalec (2,890 p.)

Cześć, mam problem z zadaniem ze SPOJA (https://pl.spoj.com/problems/KC015/). Napisałem program który u mnie działa jak należy, ale SPOJ odrzuca mi go z powodu "Błędnej Odpowiedzi". Wie ktoś o co chodzi?

Mój kod:

#include <iostream>

using namespace std;

int p;

void rowna(string liczba1, string liczba2)
{
        if(liczba1.length()==liczba2.length())
           {
               for(int i=0; i<liczba1.length();i++)
               {
                   if(liczba1[i]!=liczba2[i])
                   {
                       p=1;
                   }
               }
               if(p==1)cout<<"0"<<endl;
               else cout<<"1"<<endl;
           }
           else cout<<"0"<<endl;
}

void wieksza(string liczba1, string liczba2)
{
        if(liczba1.length()>=liczba2.length())
           {
               for(int i=0; i<liczba1.length();i++)
               {
                   if(liczba1[i]<liczba2[i])
                   {
                       if(p==0)
                       {
                        p=1;
                       }
                   }
               }
               if(p==1)cout<<"0"<<endl;
               else cout<<"1"<<endl;
           }
           else cout<<"0"<<endl;
}

void mniejsza(string liczba1, string liczba2)
{
      if(liczba1.length()<=liczba2.length())
           {
               for(int i=0; i<liczba1.length();i++)
               {
                   if(liczba1[i]>liczba2[i])
                   {
                       if(p==0)
                       {
                        p=1;
                       }
                   }
               }
               if(p==1)cout<<"0"<<endl;
               else cout<<"1"<<endl;
           }
           else cout<<"0"<<endl;
}


int main()
{
    string liczba1,znak,liczba2;
    while(cin>>liczba1>>znak>>liczba2)
    {
            p=0;
        if(znak=="==")
        {
            rowna(liczba1, liczba2);
        }
        else if(znak==">=")
        {
            wieksza(liczba1,liczba2);
        }
        else
        {
             mniejsza(liczba1,liczba2);
        }
    }
    return 0;
}

 

komentarz 21 sierpnia 2018 przez aaron Początkujący (300 p.)
A czy program dobrze odczytuje dane ze spoja? Zwróć uwagę na to że  liczba a potem znak jest podawany po spacji a nie enterze a w C++ chyba trzeba wcisnąć enter aby wykonał się kolejny cin.
komentarz 22 sierpnia 2018 przez niezalogowany

@aaron std::cin pobiera wejście do napotkania białego znaku.

1 odpowiedź

+2 głosów
odpowiedź 22 sierpnia 2018 przez niezalogowany

Przykładowy test dla błędnej odpowiedzi:

345987024309867543290875 >= 1

Jeżeli długość pierwszego łańcucha jest większa od drugiego to możesz od razu wypisać wynik (lepiej byłoby zwracać true/false). Tylko dla przypadku gdy długości są równe porównuj kolejne cyfry. W przypadku gdy znajdujesz pierwszą parę nierównych cyfr możesz od razu przerwać pętlę break i wypisać odpowiedni wynik.

komentarz 22 sierpnia 2018 przez Piotr Błaszczak Bywalec (2,890 p.)

Poprawiłem, a SPOJ dalej nie przyjmuje. Teraz jest w takiej formie:

#include <iostream>

using namespace std;

int p;

void rowna(string liczba1, string liczba2)
{
        if(liczba1.length()==liczba2.length())
           {
               for(int i=0; i<liczba1.length();i++)
               {
                   if(liczba1[i]!=liczba2[i])
                   {
                       p=1;
                       break;
                   }
               }
               if(p==1)cout<<"0"<<endl;
               else cout<<"1"<<endl;
           }
           else cout<<"0"<<endl;
}

void wieksza(string liczba1, string liczba2)
{
    if(liczba1.length()>liczba2.length())cout<<"1"<<endl;
       else if(liczba1.length()==liczba2.length())
           {
               for(int i=0; i<liczba1.length();i++)
               {
                   if(liczba1[i]<liczba2[i])
                   {
                       if(p==0)
                       {
                        p=1;
                        break;
                       }
                   }
               }
               if(p==1)cout<<"0"<<endl;
               else cout<<"1"<<endl;
           }
           else cout<<"0"<<endl;
}

void mniejsza(string liczba1, string liczba2)
{
    if(liczba1.length()<liczba2.length())cout<<"1"<<endl;
     else if(liczba1.length()==liczba2.length())
           {
               for(int i=0; i<liczba1.length();i++)
               {
                   if(liczba1[i]>liczba2[i])
                   {
                       if(p==0)
                       {
                        p=1;
                        break;
                       }
                   }
               }
               if(p==1)cout<<"0"<<endl;
               else cout<<"1"<<endl;
           }
           else cout<<"0"<<endl;
}


int main()
{
    string liczba1,znak,liczba2;
    while(cin>>liczba1>>znak>>liczba2)
    {
            p=0;
        if(znak=="==")
        {
            rowna(liczba1, liczba2);
        }
        else if(znak==">=")
        {
            wieksza(liczba1,liczba2);
        }
        else
        {
             mniejsza(liczba1,liczba2);
        }
    }
    return 0;
}

 

komentarz 22 sierpnia 2018 przez niezalogowany
Dodaj jeszcze funkcję dla != i warunek dla niej. Powinno zaliczyć kod.
komentarz 22 sierpnia 2018 przez Piotr Błaszczak Bywalec (2,890 p.)
Nie bardzo rozumiem, jaką funkcję, gdzie? Jeżeli chodzi o to, że liczba nie jest ani wieksza/mniejsza ani równa liczbie2 to do tego jest warunek else
komentarz 22 sierpnia 2018 przez niezalogowany

W zadaniu masz 4 możliwości: >=, ==, <= i !=. Więc brakuje Ci jeszcze jednego warunku i funkcji dla niej:

#include <iostream>
 
using namespace std;
 
int p;
 
void rowna(string liczba1, string liczba2)
{
	if (liczba1.length() == liczba2.length())
	{
		for (int i = 0; i<liczba1.length(); i++)
		{
			if (liczba1[i] != liczba2[i])
			{
				p = 1;
				break;
			}
		}
		if (p == 1)cout << "0" << endl;
		else cout << "1" << endl;
	}
	else cout << "0" << endl;
}
 
void wieksza(string liczba1, string liczba2)
{
	if (liczba1.length()>liczba2.length())cout << "1" << endl;
	else if (liczba1.length() == liczba2.length())
	{
		for (int i = 0; i<liczba1.length(); i++)
		{
			if (liczba1[i]<liczba2[i])
			{
				if (p == 0)
				{
					p = 1;
					break;
				}
			}
		}
		if (p == 1)cout << "0" << endl;
		else cout << "1" << endl;
	}
	else cout << "0" << endl;
}
 
void mniejsza(string liczba1, string liczba2)
{
	if (liczba1.length()<liczba2.length())cout << "1" << endl;
	else if (liczba1.length() == liczba2.length())
	{
		for (int i = 0; i<liczba1.length(); i++)
		{
			if (liczba1[i]>liczba2[i])
			{
				if (p == 0)
				{
					p = 1;
					break;
				}
			}
		}
		if (p == 1)cout << "0" << endl;
		else cout << "1" << endl;
	}
	else cout << "0" << endl;
}
 
void nierowna(string liczba1, string liczba2)
{
	if (liczba1.length() == liczba2.length())
	{
		for (int i = 0; i<liczba1.length(); i++)
		{
			if (liczba1[i] != liczba2[i])
			{
				p = 1;
				break;
			}
		}
		if (p == 1)cout << "1" << endl;
		else cout << "0" << endl;
	}
	else cout << "1" << endl;
}
 
 
int main()
{
	string liczba1, znak, liczba2;
	while (cin >> liczba1 >> znak >> liczba2)
	{
		p = 0;
		if (znak == "==")
		{
			rowna(liczba1, liczba2);
		}
		else if (znak == "!=")
		{
			nierowna(liczba1, liczba2);
		}
		else if (znak == ">=")
		{
			wieksza(liczba1, liczba2);
		}
		else
		{
			mniejsza(liczba1, liczba2);
		}
	}
	return 0;
}
komentarz 22 sierpnia 2018 przez Piotr Błaszczak Bywalec (2,890 p.)
A no racja :) Dzięki wielkie :)

Podobne pytania

0 głosów
1 odpowiedź 895 wizyt
0 głosów
0 odpowiedzi 557 wizyt
pytanie zadane 25 września 2021 w C i C++ przez Exequilas Nowicjusz (210 p.)
0 głosów
1 odpowiedź 520 wizyt
pytanie zadane 1 czerwca 2018 w C i C++ przez piter11251 Obywatel (1,300 p.)

93,742 zapytań

142,680 odpowiedzi

323,299 komentarzy

63,329 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...