Porównywanie dużych liczb

0

Witam. Napisalem program, ktory porownuje takie liczby, ktorych long long int nie pomiesci. Wszystkie testy ze SPOJA oraz moje wlasne testy wychodza dobrze, a jednak SPOJ odrzuca.
Pomoze ktos?

#include<iostream>
#include<string>
using namespace std;
int check(string a, string relation, string b)
{
	unsigned sizeA, sizeB;
	
	if (relation == "==")
	{
		sizeA = a.length();
		sizeB = b.length();
		if (sizeA != sizeB) return 0;
		else
		{
			for (unsigned i = 0; i < sizeA; ++i)
			{
				if (a[i]!=b[i]) return 0;
			}
			return 1;
		}
	}
	else if (relation == "!=")
	{
		sizeA = a.length();
		sizeB = b.length();
		if (sizeA != sizeB) return 1;
		else
		{
			for (unsigned i = 0; i < sizeA; ++i)
			{
				if (a[i] == b[i]) return 0;
			}
			return 1;
		}
	}
	else if (relation == "<=")
	{
		sizeA = a.length();
		sizeB = b.length();
		if (sizeA > sizeB) return 0;
		else if (sizeA < sizeB) return 1;
		else if (sizeA == sizeB)
		{
			for (unsigned i = 0; i < sizeA; ++i)
			{
				if (a[i]>b[i]) return 0;
			}
			return 1;
		}
	}
	else if (relation == ">=")
	{
		sizeA = a.length();
		sizeB = b.length();
		if (sizeA < sizeB) return 0;
		else if (sizeA > sizeB) return 1;
		else if (sizeA == sizeB)
		{
			for (unsigned i = 0; i < sizeA; ++i)
			{
				if (a[i]<b[i]) return 0;
			}
			return 1;
		}
	}
}
int main()
{
	string a, b, relation;
	
	while (cin >> a >> relation >> b)
	{
		if (check(a, relation, b)) cout << "1" << endl;
		else cout << "0" << endl;
	}
	return 0;
}
1

Zera na początku:

$ ./test
01 == 1
0

W danych wejściowych zawsze spodziewaj się niespodziewanego :>. Reszta wygląda ok, ale nie testowałem dokładnie

1

Ok, to popatrzyłem na kod bardziej:

$ ./test
123456
!=
100000
0
1234
!=
4321
1

Bo:
dla !=:

for (unsigned i = 0; i < sizeA; ++i)
{
    if (a[i] == b[i]) return 0;
}
return 1;

To tak nie działa. Jesli przynajmniej jeden znak się różni, są to inne liczby. A nie odwrotnie (u Ciebie: przynajmniej jeden znak jest taki sam, więc są takie same).

Przy <= też problemy:

1234 <= 2000
0
1 <= 2
1

Oraz przy >=

2 >= 1
1
2000 >= 1999
0

W tym przypadku dlatego że masz jednostronny warunek:

for (unsigned i = 0; i < sizeA; ++i)
{
    if (a[i]>b[i]) return 0; // sprawdzenie tylko w jedną stronę
}
return 1;

Powinieneś przechodzić dalej w pętli /tylko/ jeśli a[i] == b[i].

Hmm, na pewno to testowałeś?

0

@sztukers, Może wreszcie przeczytasz uważnie ile cyfr mogą mieć liczby w tym zadaniu ze SPOJ'a?

1 użytkowników online, w tym zalogowanych: 0, gości: 1