Skocz do zawartości

Proj: "Dzielenie przez siebie liczb zap. w dwoch tab in


Wyvern

Recommended Posts

Zwracam sie z prosba o pomoc w rozwiazaniu meczacego mnie od jakiegos czasu problemu.
Sprawa polega na tym, iz usiluje napisac klase, ktora odpowiedzialna bedzie za przetwarzanie tablic typu int, zawierajacych bardzo duze liczby calkowite zapisane w sposob sekwencyjny np. takie:

int tab1[] = {1,2,3,4,5,6,7,8};
int tab2[] = {2};

Teraz np. tab1[3] bedzie mialo wartrosc 4 - i tak tez konstruktor alokuje te dane w tych tablicach typu int (cyfra po cyfrze), wczesniej otrzymujac jako parametr wejsciowy przy deklaracji/inicjacji obiektu ciag znakow char* reprezentujacy duza cyfre np.

KlasaDuzaCalkowita obiekt1("123450000000000000000000");

UPROSZCZONY KOD KONSTRUKTORA:
DuzaCalkowita::DuzaCalkowita(const char *napis) //definicja konstruktora kopiującego.
{
int i,j;
int dlg = strlen(napis);
for(i=0; i<=MAX-1; i++) intTablica=0; //inicjacja zm. skladowej - tab. przechowujacej liczbe (wypelnianie zerami).

for(i=MAX-dlg; i<=MAX-1; i++) // MAX, to stała - maksymalna wielkosc tablicy intTablica - składowej.
intTablica = napis-'0'; // lub: if(intTablica != '0') { intTablica = napis; }
}

Jak widac, dzieki takiemu zapisowi liczby moga byc bardzo duze (tutaj maksymalnie o wielkosci tablicy intTablica - w tym przykladzie MAX). Skadową klasy jest wiec taka tablica, w ktorej kazdy z obiektow przechowuje swoja "duza liczbe". Klasa dokonuje wszystkich podstawowych operacji arytmetycznych (np. obiekt1 = obiekt2 + obiekt3) dzieki przeciazonym operatorom dla tych obiektow np.

KlasaDuzaCalkowita obiekt1("1234"), obiekt2("2222"), obiekt3;
obiekt3 = obiekt1 + obiekt2;

I taka prosta operacja arytmetyczna odbywa sie w przeciazonym operatorze dodawania mniej-wiecej tak jak dodawanie w slopku wiec:

obiekt1: 1234
obiekt2: 2222
obiekt3: 3456

UPROSZCZONY KOD PRZECIAZONEGO OPERATORA DODAWANIA:DuzaCalkowita DuzaCalkowita::operator+(const char *napis)
{
KlasaDuzaCalkowita pom, prawy(napis);
int przeniesienie=0;

for(int i=MAX-1;i>=0;i--) //iteracja dodawania.
{
pom.intTablica = intTablica+prawy.intTablica+przeniesienie;
if(pom.intTablica
> 9)
{
pom.intTablica = pom.intTablica%10;
przeniesienie=1;
}
else
przeniesienie=0;
}

return pom;
}

Gdzie tkwi problem!!!
Mimo usilnych staran, nie wpadlem jeszcze na odpowiednio wydajny sposob przeciazenia operatora dzielenia ' / '.
Probowalem dokonac tego na rozne sposoby, ale albo dzialalo zbyt wolno, albo generowalo bledne wyniki.
Dlatego bardzo prosze o pomoc w rozwiazaniu problemu dot. przeciazonego operatora dzielenia ' / ', ktory bedzie dzialal na ww. zasadach.

Moje podejscie do sprawy:
[mamy sytulacje: obiekt1/obiekt2].
- oszacowac dlg. obiektu po lewej i po prawej stronie dzialania, co pozwoli oszacowac dlugosc wyniku,
- badanie ile razy obiekt2 zmiesci sie w obiekcie1
(tu tkwi problem - mozna to zrobic nawet na zasadzie dzielenia w slupku - tak jak powyzsze dodawanie, ale chyba nie uniknie sie wtedy rekurencji)
- zwrocenie wyniku przez funkcje przec. operatora ' / '.

Dziekuje za doczytanie tego listu az do tego mometu i bardzo prosze o przeslanie ewentualnych propozycji rozwiazania tego problemu pod adres: przemek-michalski@wp.pl , za wszelka pomoc dziekuje.

PS.
Uzywam VC++ 6 (kalsa jest pisana w ANSI/ISO C++).
Przepraszam za list w formacie HTML.

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...