2016-07-11 13 views
-5

Ich benutze 64-Bit-Betriebssystem, dann auch nicht in der Lage, 46. Fibonacci-Nummer richtig zu drucken, die weniger als 4 Milliarden ist.Warum kann ich die 47. Fibonacci-Nummer nicht korrekt drucken?

#include<cs50.h> 
#include<stdio.h> 

int main(void) 
{ 

    unsigned int n=50; 
    int array[n]; 
    array[0]=0; 
    array[1]=1; 
    printf("%i\n",array[0]); 
    printf("%i\n",array[1]); 
    for(int i=2;i<n;i++) 
    { 
     array[i]=array[i-1]+array[i-2]; 
     printf("%i\n",array[i]); 
    } 
+0

' int Array [n]; printf ("% i \ n", Array [i]); '->' vorzeichenloses int-Array [n]; printf ("% u \ n", Array [i]); ' – kaylum

+0

@kaylum unsigned int geht immer noch aus dem Bereich am 49. Element. –

+0

@RishikeshRaje Ja, ich war buchstäblich, weil die Frage lautet: "Warum kann ich 47. nicht drucken?". Wenn Sie diese Änderung vornehmen, wird der 47. korrekt gedruckt. Und das OP erwähnte speziell "4 Milliarden", was andeutet, dass OP über die Grenzen einer 32-Bit-Zahl informiert ist und somit erwarten könnte, den Überlauf zu sehen, sobald er diese Zahl überschritten hat, aber vorher nicht. – kaylum

Antwort

2

Sie müssen lange als Datentyp des Arrays verwenden. weil Sie Out-Range-Zahlen des Integer-Bereichs speichern werden (- 2.147.483.648 bis 2.147.483.647) Und die Deklaration von int i sollte vor der for-Schleife sein.

#include<stdio.h> 

int main(void) 
{ 

    int n=50; 
    long long array[n]; 
    array[0]=0; 
    array[1]=1; 
    printf("%lli\n",array[0]); 
    printf("%lli\n",array[1]); 
    int i; 
    for(i=2;i<n;i++) 
    { 
     array[i]=array[i-1]+array[i-2]; 
     printf("%lli\n",array[i]); 
    } 
} 
+1

"Und die Deklaration von int ich sollte vor der for-Schleife sein." -> Da C99, 'für (int i = 2; i chux

+1

ja. Du hast Recht. Vielen Dank. Ich werde es reparieren. –

2

ich bin nicht in der Lage richtig 46th Fibonacci-Zahl zu drucken, die weniger als 4 Milliarden ist.

Sie sind höchstwahrscheinlich außerhalb der Reichweite einer ganzen Zahl gehen, die von -4294967296 bis 4294967295

ändern int array[n];-long long array[n];

Auch ist, sollten die printf des %i-%lli

geändert werden

Edit: Beim Ausführen der Zahlen erhalten Sie den erwarteten Wert von F (48) als 4807526976, die außerhalb des Bereichs einer Ganzzahl ist.

+1

Der Bereich einer 32-Bit-Zahl mit Vorzeichen ist -2147483648 bis 2147483647. – user3386109

1

Mit Rishikesh Raje's Zählsystem (dh 1st Fibonacci ist 1), wo F (48) 4807526976 ist, konnten Sie F (47) 2971215073 nicht erhalten, da @kaylum kommentierte, dass Sie ein vorzeichenbehaftetes Ganzzahl-Array verwendet haben Halten Sie Ihre Werte, die Sie ändern müssen, zu unsigned, und ändern Sie Ihre printf-Anweisung, um ein unsigned zu drucken. Dies würde Ihnen erlauben, die Grenze von 32-Bit-Arithmetik zu erreichen:

#include <stdio.h> 

#define LIMIT (50) 

int main(void) { 
    unsigned int array[LIMIT] = {0, 1}; 

    printf("%u\n", array[0]); 
    printf("%u\n", array[1]); 

    for (size_t i = 2; i < LIMIT; i++) 
    { 
     array[i] = array[i - 1] + array[i - 2]; 
     printf("%u\n", array[i]); 
    } 

    return 0; 
} 

über 32 Bits zu erhalten, Sie zu lange oder lange longs wechseln können wie Rishikesh Raje vermuten lässt, aber mit unsigned Varianten arbeiten, wenn Sie erreichen wollen das maximale Ergebnis kann mit einer bestimmten Anzahl von Bits erreicht werden.

0

Verwenden Sie entweder ein unsigned Integer-Array oder für höhere Werte verwenden unsigned long long long Array aber Sie nicht ein Array benötigen Fibonacci-Serie drucken Sie dies einfach tun können: -

void main() 
{ 
    unsigned long long i=1, num1=1, num2=0; 
    printf("1 \n"); 
    for(i; i<100 ; i++) 
    { 
    num1=num1+num2; 
    num2=num1-num2; 
    printf("%lli \n", num1); 
    } 
    getch(); 
}