porównywanie dużych liczb

0

Witam, mam takie zadanie:

Napisz program, który sprawdza, czy pomiędzy daną parą liczb zachodzi podana relacja.

Wejście

Na wejście programu podana zostanie pewna liczba zestawów danych. Zestawy składają się z liczby, po której następuje spacja, symbol relacji (==, !=, >= lub <=), spacja i druga liczba. Poszczególne zestawy zostaną rozdzielone znakiem nowej linii. Przyjmujemy, że żadna z liczb nie ma więcej niż 1000 cyfr.

Wyjście

Na wyjściu programu ma się pojawić ciąg zerojedynkowy, którego i-ty element jest równy 1 lub 0 w zależności od tego, czy relacja zawarta w i-tym wczytanym z wejścia zestawie danych jest prawdziwa czy fałszywa. Poszczególne elementy tego ciągu należy rozdzielić znakami nowej linii.

moje rozwiązanie daje błędną odpowiedź, czy ktoś mógłby mi pomóc wskazać błąd?

 
#include <iostream>
#include <string>  

using namespace std;


int main ()
{
	while(true)
	{
	
	string liczba1;
	string liczba2;
	string znak1;
	int znak2;
	int a;
	
	cin>>liczba1>>znak1>>liczba2;

	if (znak1== "<=")  znak2=1;
	if (znak1== ">=")  znak2=2;
	if (znak1== "==")  znak2=3;
	if (znak1== "!=")  znak2=4;
	

	switch (znak2)
            {      
                   case (1):
                        if(liczba1.size()>liczba2.size() ) cout<<"0"<<endl; 
						else if(liczba1.size()<liczba2.size() ) cout<<"1"<<endl; 
					   else 
					   {
						   for(int i=0; i<liczba1.size(); i++)
						   {
								if(liczba1[i]>liczba2[i]) 
									{
										a=0;
										break;
									}
								else {
									if(i==liczba1.size()-1) 
									{a=1;
									break;
									}
								}
							
							}
						   
						   if(a!=1)
						   {
						   cout<<"0"<<endl;
						   }
						   if(a==1)
						   cout<<"1"<<endl;
					   }
                   break;
                             
                   case (2):

					   if(liczba1.size()<liczba2.size() ) cout<<"0"<<endl; 
					   else if(liczba1.size()>liczba2.size()) cout<<"1"<<endl;
					   else 
					   {
						   for(int i=0; i<liczba1.size(); i++)
						   {
								if(liczba1[i]<liczba2[i] && liczba1.size()<=liczba2.size()) 
									{
										a=0;
										break;
									}
								
								else {
									if(i==liczba1.size()-1) 
									{a=1;
									break;
									}
								}
							
							}
						   
						   if(a!=1)
						   {
						   cout<<"0"<<endl;
						   }
						   if(a==1)
						   cout<<"1"<<endl;
					   }
                        
                   break;

				   case (3):
                       if(liczba1.size()!=liczba2.size()) cout<<"0"<<endl; 
					   else 
					   {
						   for(int i=0; i<liczba1.size(); i++)
						   {
							if(liczba1[i]!=liczba2[i]) 
							{
								a=0;
								break;
							}
							else if(liczba1[i]==liczba2[i] && i==liczba1.size()-1) 
								{   

									cout<<"1"<<endl;
									a=1;
							}
						   }
						   if(a!=1)
						   {
						   cout<<"0"<<endl;
						   }
					   }
                   break;
                             
                   case (4):
					    if(liczba1.size()!=liczba2.size()) cout<<"1"<<endl; 
					   else 
					  {
						   for(int i=0; i<liczba1.size(); i++)
						   {
							
							if(liczba1[i]!=liczba2[i] ) 
								{   
									a=1;
									break;
								}
							else if(liczba1[i]==liczba2[i] && i==liczba1.size()-1) 
								{   
									cout<<"0"<<endl;
									a=0;
								}
							
							}
						    if(a==1)
						   {
						   cout<<"1"<<endl;
						   }
                        
                   break;
            }        
	}     
    
	
	if(cin.eof())break;

	}
  system("pause");

  return 0;
}
1

Ten cały program to jeden wielki błąd.
Napisz go ponownie...

0

Dlaczego błąd?

0

1.Formatowanie poprzez losowe wciskanie tabulatora jest złe.
2.Brak jakiegokolwiek podziału na struktury/klasy oraz funkcje.
3.Ogólna nieczytelność kodu spowodowana w/w punktami.

0

zrób sobie sześć funkcji

void wyswietl()
int uzupelnijDoWyswietlenia()
int wiekszy(string lewy, string prawy);
int wiekszyLubRowny(string lewy, string prawy);
int mniejszy (string lewy, string prawy);
int mniejszyLubRowny (string lewy, string prawy);

wyswietl i pornownaj możesz opakować ładnie w klasę (przez co nie będzie trzeba do nich przekazywać parametrów)
będziesz potrzebował także czeterech zmiennych
string doWyswietlenia;
string lewy;
string prawy;
string relacja;

w funkcji wyswietl robisz po prostu cout << doWyswietlenia (albo przeciąż operator << to tej funkcji też się pozbędziesz)
w funkcji uzupelnijDoWyswietlenia robisz jedną pętle i w zależności od operatora wywołujesz odpowiednią funkcje. To co funkcja zwróci przypisujesz do doWyswietlenia

to taki pomysł na szybko. Z resztą powinieneś sobie poradzić ;) Jak takie coś napiszesz to na pewno będzie działać a późniejsza zmiana nie będzie Ci zabierać tak długo czasu.

0
asdfghjkl12345 napisał(a):

Dlaczego błąd?
Dla tego że kod poniżej robi to samo a nawet więcej:

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

int main ()
  {
   while(true)
     {
      string A,B,op;
      cin>>A>>op>>B;
      int v=((int)A.size())-((int)B.size()); // przy dużych napisach może nie być poprawnie
      for(int i=0;(i<A.size())&&(!v);++i) v=((int)A[i])-((int)B[i]);
      if(op=="==") cout<<(v==0)<<endl;
      else if(op=="!=") cout<<(v!=0)<<endl;
      else if(op=="<=") cout<<(v<=0)<<endl;
      else if(op==">=") cout<<(v>=0)<<endl;
      else if(op=="<") cout<<(v<0)<<endl;
      else if(op==">") cout<<(v>0)<<endl;
      else cout<<"nieznana operacja"<<endl;
     }
   return 0;
  }
0

Jak to ze SPOJa to proponuję dać sobie spokój z c i napisać w czymś to co obsługuje dowolnie długie liczby np pythonie.

0

@_13th_Dragon: troszkę przekombinowałeś :) :

#include <iostream>
#include <string>
using namespace std;
 
int main () {
    string A,B,op;
    while(cin>>A>>op>>B) {
      int diff = A.size()-B.size();
      if (diff==0) {
          diff = A.compare(B);
      }
      if(op=="==") cout<<(diff == 0)<<endl;
      else if(op=="!=") cout<<(diff !=0)<<endl;
      else if(op=="<=") cout<<(diff <=0)<<endl;
      else if(op==">=") cout<<(diff >=0)<<endl;
      else if(op=="<") cout<<(diff <0)<<endl;
      else if(op==">") cout<<(diff >0)<<endl;
      else cout<<"nieznana operacja"<<endl;
     }
   return 0;
  }

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