liczby wieksze niz long long int....i tablice?

0

spotkałem się już nie raz z takim czymś że jak podam liczbe która ma np. 200 cyfr w sobie (albo nawet wystarczy 30 ;] ) i będę chciał wykonywać na niej jakieś operacje to żaden typ mi tego nie zrobi (mówie o standardowych typach) i dlatego trzeba ją "wsadzić" do tablicy...i moje pytanie jest jak to zrobić i jak sie to już zrobić to jak wykonywać działania na takim bycie? ;-(

0

Wczytaj liczbę do stringa a potem wrzuć do tablicy do oddzielnych komórek kolejne cyfry tej liczby. Operacje na niej to już metody słupkowe (czy jak tam zwał). Oczywiście ten sposób jest bardzo wolny. W Internecie jest trochę darmowych bibliotek do obsługi dużych liczb, więc może lepiej nie bawić się w samodzielną implementację.
Pozdrawiam

0

okay, no to przykład:
mam 11 podnieść do potęgi 200, wynik to:

1899052764604618242121820463954
11634058583224000987784812725145610376264616798914075066206
659332845581358818052384010449494358683679059130200059114423400623872273759556645768363416895
87626164144676307968892001

może mi ktoś napisać taki program który to liczy? sory ale na przykładzie najlepiej...

0

http://opss.safo.biz/?menu=comp&sub=prob&comp=0&prob=1012

Napisałem ten program. Jeśli chcesz, żebym Ci zepsuł zabawę, to mogę go tu wkleić, ale pomyśl sam, to nie jest trudne. Po prostu symuluj tworzenie trójkąta Pascala.

Program jest napisany nieelegancko, gdyż dopiero zaczynam programować.

0

Poczytaj o BCD.

http://en.wikipedia.org/wiki/Binary-coded_decimal

Mozesz obslugiwac dowolnie duze liczby jakie tylko zmieszcza sie w pamieci kompa.

0

owszem, mówie o opss-ie ale aktualnie jestem przy innym zadaniu ;]
o bcd zaraz bede czytal wiec jak na razie dzieki :)

0

poczytałem o BCD ale jakoś mi to wiele nie pomogło przynajmiej nie bardzo wiem jak moge to zastosować...

0
  1. zaimplementuj klase TBCDInteger
  2. przeciaz dla niej operatory +,-,*,/,==,=
  3. przydalyby sie tez metody:
  • AnsiString GetAsString(void);
  • moze tez void SetValue(AnsiString AValue); , chociaz bardziej elegancko byloby to zrobic jako przeciazony operator TBCDInteger = AnsiString

Jak juz to bedziesz mial gotowe mozesz przystapic do implementacji algorytmu.

0

a nie ma czegos prostszego? bo raczej nie wierze zeby nie bylo

0

To jest bardzo dobre ćwiczenie, warto zrobić to samemu.
Wiesz wszystko co jest potrzebne by to zrobić.
A że można to zrobić lepiej lub gożej, to znaczy że będzie działać wolno, tym na razie się nie martw. Od czegoś trzeba zacząć.

W tablicy masz cyfry liczby, pod indeksem równym zero cyfra najmniej znacząca (jedności).
Zacznij od dodawania i odejmowania.
Przyjmij, że obie liczby mają tą samą długość, ale pamiętaj żeby uzupełnić je nieznaczącymi zerami.
cyfry jakby odwrotnie
0000000012
0000000678

????????????
Napisałem "jakby odwrotnie", bo ja wolę sobie wyobrażać tablicę od lewej to prawej, czyli t[0], t[1], t[2]...
ale myśląc o liczbach, myślę że na początku jest ta najstarsza. Można do tego podejść tak czy siak, na początek trzeba się na coś zdecydować.
dodawanie, może wyglądać np. tak:

i#define N 1000


// w[N]=a[N]+b[N]
void dodawanie (int w[], int a[], int b[]) {
    for (int i=0, int c=0; i<N; i++) {
         c=a[i]+b[i];
         w[i]=c % 10;
         c/=10;  // ewentualne przeniesienie 
    }}

Przy odejmowanie może pojawić się problem gdy wynik będzie ujemny, na początek przyjmij, że a>b, czyli wynik będzie dodatni.
Jeżeli będzie ci się chciało to drążyć to pomożemy.

0

Mały prezent

void wyswietl(int c[]) {
        int i;
        for (i=N-1; i>0; i--)              // szukam pierwszej znaczącej cyfry
              if (c[i] != 0) break;
        while (i>=0)                       // pokazuję kolejne cyfry
              printf("$d",c[i--]);
        printf("\n");                      //mozna ewentualnie wywalić
}
0

było tyle razy... biblioteka vlong, wersja w C autorstwa flabry.

0

Na zakodowanie jednej cyfry w BCD potrzeba tylko cztery bity. Jeśli zaimplementujesz takie kodowanie będziesz mógł operować na liczbach składających sie z milionów cyfr (o ile nie miliardów).

0

po co bcd? równie łatwo można dane przechowywać bez żadnej konwersji. co prawda zysk jest marny, ale nie widzę powodu do marnowania pamięci, zwłaszcza gdy gotowa implementacja już czeka.

0
mgr.Dobrowolski napisał(a)

To jest bardzo dobre ćwiczenie, warto zrobić to samemu.
Wiesz wszystko co jest potrzebne by to zrobić.
A że można to zrobić lepiej lub ort!, to znaczy że będzie działać wolno, tym na razie się nie martw. Od czegoś trzeba zacząć.

0
ŁF napisał(a)

po co bcd? równie łatwo można dane przechowywać bez żadnej konwersji. co prawda zysk jest marny, ale nie widzę powodu do marnowania pamięci, zwłaszcza gdy gotowa implementacja już czeka.

BCD nie marnuje pamieci, wrecz przeciwnie, powyzej pewnej wartosci zapis BCD zajmuje mniej pamieci niz zapis konwencjonalny.

0
EgonOlsen napisał(a)

[...]powyzej pewnej wartosci zapis BCD zajmuje mniej pamieci niz zapis konwencjonalny.
w 4 bitach tylko 10 wartości zamiast 16. jest to to jednak pewne marnotrawstwo, zawsze.
A ileż z tym kłopotu, bo proponujesz w bajcie przechowywać 2 cyfry? Jak je np. dodać bez assemblerowego DAA (chyba),
to co jedna cyfra w jednym bajcie? czyli tylko 10 wartości zamiast 256? A to już nie BCD.
Uważam, że początkującemu warto poradzić jedną cyfrę w jednym bajcie (char), a może nawet w czterech (int).
Kolejnym udoskonaleniem będzie np. pamiętanie w jednym 16 bitowym słowie 4 cyfr, 0..9999.
Np mnożenie przyśpieszy 16 krotnie (dodawanie/odejmowanie przyśpieszy tylko 4 razy),
a zamiana na dziesiętne jest trywialna (szybka i łatwa). Będziemy liczyć w układzie o podstawie=10000.
10'000 to dobra wartość dla 32 bitowej maszyny, ponieważ 10'000*10'000 mieści się w 32 bitach.
Jeżeli chodzi o szybkość obliczeń, to najszybszym sposobem byłoby przyjęcie za podstawę 65536 (2^16),
nie marnujemy ani połowy bitu ni kwantu czasu, ale wyświetlenie takiej liczby (dziesiętnie) może zająć tyle czasu, że zniweczy to zysk.

0
mgr.Dobrowolski napisał(a)
EgonOlsen napisał(a)

[...]powyzej pewnej wartosci zapis BCD zajmuje mniej pamieci niz zapis konwencjonalny.
w 4 bitach tylko 10 wartości zamiast 16. jest to to jednak pewne marnotrawstwo, zawsze.

Tez na poczatku tak myslalem, jednak kiedys jeden kolega na wykladzie przeprowadzil dowod na to ze dla bardzo duzych liczb wlasnie BCD zajmuje mniej pamieci. (Implementowal BCD na prace inzynierska). Nie pamietam tylko jaka to byla wartosc :/

mgr.Dobrowolski napisał(a)

A ileż z tym kłopotu, bo proponujesz w bajcie przechowywać 2 cyfry? Jak je np. dodać bez assemblerowego DAA (chyba)

Mozna wykorzystac operacje bitowe << i >>.

mgr.Dobrowolski napisał(a)

to co jedna cyfra w jednym bajcie? czyli tylko 10 wartości zamiast 256? A to już nie BCD.

Jedna cyfra na 4 bitach. Jeden bajt reprezentuje wartosci od 00 do 99

0
  1. to zależy co rozumiemy przez "konwencjonalny", a dowód kolegi pachnie mi szarlatanerią

  2. napisałem "ileż z tym kłopotu"

  3. wiem, wiem, pisałem przecie że: "to już nie BCD"

0
mgr.Dobrowolski napisał(a)
  1. to zależy co rozumiemy przez "konwencjonalny", a dowód kolegi pachnie mi szarlatanerią

Stary profesor od algorytmów kazał słuchać referującego i uczyć się. Tak więc myślę że dowód kolegi był jak najbardziej prawdziwy. "Konwencjonalny" = "binarny" ?

mgr.Dobrowolski napisał(a)
  1. napisałem "ileż z tym kłopotu"

Fakt, z 4-5 linijek kodu więcej.

mgr.Dobrowolski napisał(a)
  1. wiem, wiem, pisałem przecie że: "to już nie BCD"

http://www.shef.ac.uk/physics/teaching/phy107/codes.html

mgr.Dobrowolski napisał(a)

Będziemy liczyć w układzie o podstawie=10000.
10'000 to dobra wartość dla 32 bitowej maszyny, ponieważ 10'000*10'000 mieści się w 32 bitach.

Rozważamy tu przypadki liczb rzędu 1E1000 lub nawet 1E1000000.

0

Wg mnie najlepsza jest baza 10^9 :) Dodawanie i odejmowanie jest trywialne, a mnożenie można zrealizować z wykorzystać JEDNEJ dodatkowej zmiennej typu long long bez przekraczania zakresów. W porównaniu z bazą 10, dodawanie jest szybsze 9 razy, a mnożenie 81 razy :D Z pamięcią też jest nieźle, wcale tak dużo się nie traci

0
  1. jeżeli konwencjonalny=binarny, to znaczy, że pan psor drzemał
  2. no właśnie, a po co?
  3. te liczby też składają się z cyfr, a cyfra wcale nie musi być cyfrą pozycyjnego systemu o podstawie równej 10 (czyli tak jak lubimy my ludzie, albo ciekawostka: przez niektórych uważany za pierwszy komputer, maszyna o nazwie ENIAC liczył dziesiętnie),
    dzisiejsze komputery wolą 2 (nie wszystkie, bo kwanty i rozmycia)

Spykaju, na 32 bitowej maszynie iloczyn 64*64 bity to 4 mnożenia.
(Ciekawe, tylko 2 razy więcej bitów a szybkość w porywach 4 razy większa. :-) )
Jak będzie lepiej (szybciej) to zależy po pierwsze primo od tego co akurat chcemy uzyskać i co potrafimy zrobić.

Poważne maszynki liczące robią takie sztuczki że... nie warto o nich wspominać początkującym.

0

Zapomnieliscie o jednym: obojetnie jaka przyjmiecie baze, zawsze ma to ograniczony zakres. BCD ogranicza tylko ilosc pamieci w kompie.

0
EgonOlsen napisał(a)

BCD ogranicza tylko ilosc pamieci w kompie.

..a "konwencjonalny" binarny jest niby bardziej ograniczony..?

0
quetzalcoatl napisał(a)
EgonOlsen napisał(a)

BCD ogranicza tylko ilosc pamieci w kompie.

..a "konwencjonalny" binarny jest niby bardziej ograniczony..?

Wymieniona wyzej baza?

0

http://carramba.ath.cx/ftp/4programmers/vlong.zip

uzywajac bcd w polowce bajtu przechowuje sie 10 wartosc, przy narmalnym kodowaniu jest wartosci 16. to jest strata. pamieci.

koniec dyskusji.

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