Wyvern Napisano Maj 20, 2018 Autor Zgłoś Udostępnij Napisano Maj 20, 2018 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.