Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Ciąg Fibonacciego

Ostatnio zmodyfikowano 2014-12-05 08:36
Autor Wiadomość
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:
C/C++
#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:
 
C/C++
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]
P-122196
Rashmistrz
» 2014-12-04 18:31:41
Wykraczasz w pewnym momencie poza zakres
unsigned long int
, czyli: 4'294'967'295


Zerknij na tabelkę, tutaj:
» Kurs C++ » Poziom 1Pojęcie zmiennej i podstawowe typy danych lekcja
P-122199
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 :/
P-122237
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.
P-122245
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





 
P-122246
« 1 »
  Strona 1 z 1