[C] Ciąg Fibonacciego
Ostatnio zmodyfikowano 2014-12-05 08:36
wędkarz Temat założony przez niniejszego użytkownika |
[C] Ciąg Fibonacciego » 2014-12-04 18:05:19 Cześć, Napisałem program, niby działa z pierwszymi liczbami poprawnie natomiast późnej pojawiają się problem, którego nie mogę znaleźć przyczyny. Przy pierwszej opcji programu: #include <stdio.h> #include <stdlib.h>
int main() { unsigned long int tab[ 100 ]; tab[ 0 ] = 1; tab[ 1 ] = 1; int i; printf( "%u \n%u \n", tab[ 0 ], tab[ 1 ] ); for( i = 2; i < 100; i++ ) { tab[ i ] = tab[ i - 1 ] + tab[ i - 2 ]; printf( "%u \n", tab[ i ] ); } return 0; }
Otrzymuje w pewnym momencie coś takiego(od góry w dół leci ciag) Oto część zwracanych wartości: 2971215073 512559680 3483774753 3996334433 3185141890 2886509027 1776683621 368225352 2144908973 2513134325 363076002 2876210327 3239286329 1820529360 764848393 2585377753 Nie wiem czemu źle się dodaje czasem i powstają mniejsze wartości. Przy drugiej opcji: long int tab[ 100 ]; tab[ 0 ] = 1; tab[ 1 ] = 1; int i; printf( "%d \n%d \n", tab[ 0 ], tab[ 1 ] );
for( i = 2; i < 100; i++ ) { tab[ i ] = tab[ i - 1 ] + tab[ i - 2 ]; printf( "%d \n", tab[ i ] ); }
otrzymuje niektóre wartości z minusem: 1134903170 1836311903 -1323752223 512559680 -811192543 -298632863 -1109825406 -1408458269 1776683621 368225352 2144908973 -1781832971 363076002 -1418756969 Błąd za pewne jest trywialny ale nie ja go nie widzę. Byłbym wdzieczny za pomoc[/i] |
|
Rashmistrz |
» 2014-12-04 18:31:41 |
|
wędkarz Temat założony przez niniejszego użytkownika |
» 2014-12-04 23:48:51 Robiłem na początku unsigned long long , teraz jeszcze raz zrobiłem i cały czas ten sam błąd a liczba jest 10 znakowa :/ |
|
Monika90 |
» 2014-12-05 08:24:31 Na unsigned long maksymalnie obliczysz 47 wyraz ciągu, a na unsigned long long 93. "%u" nie służy do drukowania unsigned long, ani tym bardziej unsigned long long. |
|
darko202 |
» 2014-12-05 08:36:05 Program masz w porządku, ale wychodzisz poza zakres to jest jak z kręceniem koła (zegarek) od 6 do 12 liczby ujemne od 12 do 6 dodatnie jeśli liczba A =~3, B=~5 to A+B =~8 (na zegarze) a to już liczba ujemna tak jest dla wszystkich typów liczbowych dlatego jeśli chcesz aby program działał ci dla dużych liczb Fibonaciego to musisz go zrobić inaczej. Są biblioteki dużych liczb które pozwalają na prawidłowe operacje na dużych liczbach ale nie są niezbędne.
Kiedyś miałem napisać program silni dla dużych liczb np. 10 000
zrobiłem to wykorzystując tworząc klasę duża liczba wykorzystując vector (kolejna cyfra liczby to kolejny element vector + implementacja przesunięcia jeśli któraś z pozycji przekracza 9) i implementując mnożenie dwóch liczb z tej klasy (jak mnożenie pod kreską ) + rekurencja. działało błyskawicznie
możesz zrobić podobnie tworząc własny kontener dynamiczny lub wykorzystując jakiś standardowy
|
|
« 1 » |