Uzupełnianie 0 w wyznaczaniu wyrazów ciągu. C++

0

Witam. Napisałem program wyznaczający zadaną liczbę wyrazów ciągu Fibonacciego, jednak w programie występuje problem, którego nie potrafię rozwiązać. Mianowicie w wyrazach do 100 wyznacza normalnie, jednak jak wpiszę np. 200 zaczyna się jakieś uzupełnianie 0 czego efektem jest coś takiego: http://zapodaj.net/28a61af13bafe.jpg.html
Nie wiem czy jest to wina systemu(?) czy może źle napisanego kodu. Z góry dzięki za pomoc :).

Kod: http://wklej.org/id/1415691/

Kompilator jakiego używam to Visual Studio Ultimate 2013

0

double ma precyzje do okolo 15 cyfr. Jak chcesz to liczyć to użyj jakiegoś bignuma.

0

Co Ty opowiadasz? Raczej 300 cyfr. Wynik działania powyższego programu w Code:Blocks GNU (GCC Compiler):

Wyraz nr 280: 14691098406862181955785513480640570995380644184160720650240
Wyraz nr 281: 23770696554372442522096386104757580086347440332736762478592
Wyraz nr 282: 38461794961234621690288749769070258389763300435852294881280
Wyraz nr 283: 62232491515607066999978285690155731168075524849634245607424
Wyraz nr 284: 100694286476841677539894436193914418789979688961305787498496
Wyraz nr 285: 162926777992448733389500122618758579190196077486759280115712
Wyraz nr 286: 263621064469290410929394558812672997980175766448065067614208
Wyraz nr 287: 426547842461739099717404284370185294098935298638101335769088
Wyraz nr 288: 690168906931029510646798843182858292079111065086166403383296
Wyraz nr 289: 1116716749392768610364203127553043586178046363724267739152384
Wyraz nr 290: 1806885656323798121011001970735901878257157428810434142535680
Wyraz nr 291: 2923602405716566909781166686533930596720949973721593929531392
Wyraz nr 292: 4730488062040365387604091833759802739549599764905812167753728
Wyraz nr 293: 7654090467756932297385258520293733336270549738627406097285120
Wyraz nr 294: 12384578529797297684989350354053536075820149503533218265038848
Wyraz nr 295: 20038668997554229982374608874347269412090699242160624362323968
Wyraz nr 296: 32423247527351529094611651934360686546196818195188979010109440
Wyraz nr 297: 52461916524905759076986260808707955958287517437349603372433408
Wyraz nr 298: 84885164052257288171597912743068642504484335632538582382542848
Wyraz nr 299: 137347080577163047248584173551776598462771853069888185754976256
Wyraz nr 300: 222232244629420346838163627942524289433543944298387859199492096
Wyraz nr 301: 359579325206583371250784718198942790963740286176353862830522368
Process returned 0 (0x0)   execution time : 3.313 s
Press any key to continue.
0

Zastosowałem typ zmiennej long double, lecz nadal jest to samo. Może to coś z kompilatorem nie tak, skoro u Ciebie w Code::Blocks normalnie to wyświetla.

0

Jak pisał @Sopelek, użyj jakiegoś niestandardowego typu liczbowego, albo zastosuj inny język (np. Python).

0

Dobra, dzięki Wam za pomoc :). Odpaliłem program w Dev-C++, typ zmiennej tak samo jak wcześniej napisałem long double i można nawet wyświetlić i ~25k wyrazów ciągu (przy większej liczbie daje już nieskończoność) :D.

0
#include <cstdio>
     
int main(int, char**)
{
    unsigned long long ulCurrentNumber = 1, ulLastNumber = 1, ulLastNum = 0;
    unsigned long n;
    printf("n> \n");
    scanf("%u", &n);
    
    printf("[0] = 1\n");
    for(unsigned long i = 1; i < n; i++)
    {
	    printf("[%i] = %llu\n", i, ulCurrentNumber);
	    ulLastNum = ulCurrentNumber;
	    ulCurrentNumber = ulCurrentNumber + ulLastNumber;
	    ulLastNumber = ulLastNum;
    }
    return 0;
} 

Dla większych liczb oczywiście nie podziała jak trzeba. Do tego trzeba napisać już sobie klasę dla dużych liczb z operatorami dodawania itd.

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