Skocz do zawartości
DragonFly

Problem

Rekomendowane odpowiedzi

Witam Robie sobie kalkulator ktory wykonuje dzialania na bardzo duzych liczbach w roznych kodach. Wpisujac podstawe 2, 10 lub 16 wybieramy system liczb. Udalo mi sie zrobic dodawanie i odejmowanie z tym ze w kodzie dziesietnym wywala mi sie jesli liczby roznia sie iloscia cyfr gdzie jest blad??

 

A tak bym zapomnial prosilbym o pomoc przy wstawieniu tu sprawnego mnozenia i dzielenia duzych liczb bo ja jak narazie nei mam zielonego pojecia jak to zrobic...

 

oto kod: http://c03b.info/m/calc.cpp

 

#include <stdio.h>#include <iostream>    //Przy wprowadzaniu z klawiatury dlugosc bufora musi byc znana i stalausing namespace std;typedef struct cyfra //Jeden element listy przechowuje jedna cyfre    {    int wartosc;  //Wartosc cyfr    cyfra *next;  //Wskaznik na nastepny  element listy (starsza cyfre)    cyfra *prev;  //Wskaznik na poprzedni element listy (mlodsza cyfre)    };void dopisz(cyfra **root, cyfra **tail, int wartosc)      //Dodaje element (cyfre) do listy - na poczatek, czyli obecnie najmlodsza    {                                           if ((*root)==NULL)        {        (*root)=new cyfra;        (*root)->wartosc=wartosc;        (*root)->next=NULL;        (*root)->prev=NULL;        (*tail)=(*root);//        cout << "pierwsza dodana\n";        }    else        {        (*root)->prev=new cyfra;        (*root)->prev->next=(*root);        (*root)=(*root)->prev;        (*root)->wartosc=wartosc;        (*root)->prev=NULL;        }    }void wprowadz(cyfra **root, cyfra **tail, int podstawa)    {    char l;    l=cin.get();    while (l!=10)        {        dopisz (root, tail, strtol((const char *)&l, (char **)NULL, podstawa));        l=cin.get();        }    //l=(char *)malloc(10000); //Staly bufor wprowadzania    //char p[2];//  cout << "Wpisz liczbe: ";    //cin >> l;//    while (*l!=0)  //      {    //    strncpy(p,l,1);      //  dopisz(root, tail, strtol((const char *)p, (char **)NULL, podstawa));     //   l++;       // }    }cyfra *dodaj(cyfra *skl1, cyfra *skl2, int podstawa) //skladnik, skladnik, wynik, zwraca wsk na ostatni element wyniku    {    cyfra *wynik=NULL;    int przeniesienie=0;    int suma=0;    do        {        if (wynik==NULL)            {            wynik=new cyfra;            wynik->next=NULL;            }        else            {            wynik->next=new cyfra;            wynik->next->prev=wynik;            wynik=wynik->next;            wynik->next=NULL;            }                    suma=przeniesienie;        przeniesienie=0;        if (skl1!=NULL)            {//            cout << "a1:" << skl1->wartosc;            suma+=skl1->wartosc;            skl1=skl1->next;            }        if (skl2!=NULL)            {            suma+=skl2->wartosc;            skl2=skl2->next;            }        if (suma>=podstawa)            {            przeniesienie=1;            suma-=podstawa;            }        wynik->wartosc=suma;//        cout <<"s:"<<suma<<"p:"<<przeniesienie<<"\n";        } while ( (skl1!=NULL || skl2!=NULL) || przeniesienie !=0  );    return wynik;    }cyfra *pomnoz(cyfra *cz1, cyfra *cz2, int podstawa)    {    int przeniesienie=0;    int suma=0;    cyfra *p1, *p2;        }int porownaj (cyfra *arg1, cyfra *arg2) //porownuje dwie liczby    {    int wynik=0;                        //porownuje od tylu (od najmlodszej)    while (arg1!=NULL && arg2!=NULL) //Poki jedna z liczb sie nie skonczy        {        if (arg1->wartosc==arg2->wartosc) //Jesli sa rowne to nastepna cyfra            {            arg1=arg1->next;            arg2=arg2->next;            }        else    //jesli nie            {            if (arg1->wartosc > arg2->wartosc)                  {                wynik=-1;   //to na razie 1 jest wieksza                }            else                {                wynik=1;   //             2                }            }        arg1=arg1->next; //i dalej        arg2=arg2->next;        }    if (arg1==NULL && arg2==NULL) //a jesli jedna sie skonczyla        {        return wynik;        }    if (arg1==NULL)        {        return -1; //to zalezy ktora        }    else        {        return 1;   //i ta ktora pierwsza sie skonczyla to jest mniejsza        }    return wynik;    }cyfra *odejmij(cyfra *arg1, cyfra *arg1t, cyfra *arg2, cyfra *arg2t, int podstawa) //Odejmuje tylko mniejsza od wiekszej...    {//    cout << porownaj(arg1, arg2) << "\n";  //  pause();    int znak=0;    if (porownaj(arg1, arg2)==-1) //... wiec najpierw porownuje        {        cyfra *tmp; // I w razie potrzeby zamienia miejscami argumenty        tmp=arg1;        arg1=arg2;        arg2=tmp;        znak=1;        }    cyfra *wynik=NULL;    int przeniesienie=0;    int suma=0;    do        {        if (wynik==NULL) //Pierwszy element listy            {            wynik=new cyfra;            wynik->next=NULL;            }        else //kolejne elementy (trzeba dowiazac do poprzedniego)            {            wynik->next=new cyfra;            wynik->next->prev=wynik;            wynik=wynik->next;            wynik->next=NULL;            }        suma=przeniesienie;        przeniesienie=0;        if (arg1!=NULL)            {//            cout << "a1:" << skl1->wartosc;            suma+=arg1->wartosc;            arg1=arg1->next;            }                    if (arg2!=NULL)            {            suma-=arg2->wartosc;            arg2=arg2->next;            }        if (suma<0)            {            przeniesienie=-1;            suma+=podstawa;            }        wynik->wartosc=suma;//        cout <<"s:"<<suma<<"p:"<<przeniesienie<<"\n";        } while ( (arg1!=NULL || arg2!=NULL) || przeniesienie !=0  );    if (znak==1)        {        wynik->wartosc=-wynik->wartosc;        }    return wynik;        }void wyswietl(cyfra *liczba) //Pobiera wsk na ostatni element    {    while (liczba!=NULL)    //Wyswietla liczbe od 'konca' czyli od najstarszej cyfry        {        switch (liczba->wartosc) //Jesli wartosc jest > 9 to wypisuje odpowiednie litery            {            case 10:                    cout << "a";                    break;            case 11:                    cout << "b";                    break;            case 12:                    cout << "c";                    break;            case 13:                    cout << "d";                    break;            case 14:                    cout << "e";                    break;            case 15:                    cout << "f";                    break;            default:            //jesli < 10 to po prostu liczbe (cyfre)                    cout << liczba->wartosc;                    break;            }        liczba=liczba->prev;        }    cout << "\n";    }int main(int argc, char *argv[]){//Wskazniki na odpowiedniocyfra *arg1=NULL, *arg2=NULL, *arg1t=NULL, *arg2t=NULL;//poczatek listy 1 liczby, poczatek listy 2 liczby//koniec listy 1 liczby, koniec listy 2 liczbycyfra *wynik=NULL, *wynikt=NULL;//poczatek listy wyniku, koniec listy wynikuint podstawa;char dzialanie;cout << "Podstawa: ";cin >> podstawa;cin.get(); //wylapuje <LF> z wprowadzania podstawycout << "Pierwszy argument: ";wprowadz(&arg1, &arg1t, podstawa);cout << "Drugi argument   : ";wprowadz(&arg2, &arg2t, podstawa);cout << "Dzialanie (+/-/*):";cin >> dzialanie;if (dzialanie=='-')    {    wynik=odejmij(arg1, arg1t,  arg2, arg2t, podstawa);    }if (dzialanie=='+')    {    wynik=dodaj(arg1, arg2, podstawa);    }    cout << "Wynik            : "; wyswietl(wynik);cin.get();cin.get();return 0;}
Edytowane przez DragonFly

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...