2013-07-29 123 views
-2
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

/* number of max three digits (max digits = MAX3DIGITS*3) */ 
#define MAX3DIGITS 100000 

/* struct that holds three digits (like 503) */ 
struct three { 
    unsigned n : 10; 
}; 

/* a whole number made up of struct threes */ 
struct num { 
    struct three n[MAX3DIGITS]; 
} number[2]; 
FILE *dg; 

int main() { 


    int naim; 
    dg=fopen("deneme.txt","w"); 



    for(naim=1;naim<1001;naim++){ 
    int prev = 0; 
    int x, y, n = 0; 
    int digits = 2; 



    number[0].n[0].n = 0; 
    number[1].n[0].n = 1; 

    while(!kbhit() && ++n < naim && digits <= MAX3DIGITS) { 
     //fprintf(stderr, "\r%i", n); 

     prev = !prev; 

     for(x = 0; x < digits; x ++) { 
      y = number[!prev].n[x].n + number[prev].n[x].n; 
      number[!prev].n[x].n = (y%1000); 
      number[!prev].n[x+1].n += (y/1000); 
     } 
     if(number[!prev].n[digits-1].n) digits ++; 
    } 

    fprintf(dg,"\nfib(%i) = %i", n, number[!prev].n[digits-2].n); 
    for(x = digits-3; x >= 0; x --) { 
     fprintf(dg,"%03i", number[!prev].n[x].n); 
    } 
    fprintf(dg,"\n"); 


    } 
    printf("sad"); 
    if(kbhit()) getche(); 
    getchar(); 
    getchar(); 
    return 0; 
} 

此代碼正在寫入前1000個斐波納契數字。但我的問題是從第18號開始。直到第十七號,這段代碼才起作用。但第18號是錯的,所以剩下的是錯的。我該如何解決它?斐波納契數字c

謝謝。

+1

似乎有關,你有一些奇怪的DIV/MOD 1000代碼F17是1000第一Fibonacci數... –

+0

相關閱讀:[斐波納契用C的偉大工程與1 - 18歲,但19根本不做任何事] (http://stackoverflow.com/questions/2880306/fibonacci-in-c-works-great-with-1-18-but-19-does-nothing-at-all) – dasblinkenlight

+0

但如果我想寫在控制檯,此代碼正在工作。 – Semih

回答

4

我只是回答這個問題,而不是在代碼上發表注意事項。 問題是你必須初始化(歸零)你用來存儲這兩個數字的內存。在您的代碼的工作版本之後,我的兩個小修改夾在// *評論之間。

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
// ***** 
#include <mem.h> 
// ***** 

/* number of max three digits (max digits = MAX3DIGITS*3) */ 
#define MAX3DIGITS 100000 


/* struct that holds three digits (like 503) */ 
struct three { 
    unsigned n : 10; 
}; 

/* a whole number made up of struct threes */ 
struct num { 
    struct three n[MAX3DIGITS]; 
} number[2]; 
FILE *dg; 

int main() { 


    int naim; 
    dg=fopen("deneme.txt","w"); 


    for(naim=1;naim<1001;naim++){ 
    int prev = 0; 
    int x, y, n = 0; 
    int digits = 2; 

    // ***** 
    memset(number, 0, sizeof(number)); 
    // ***** 

    number[0].n[0].n = 0; 
    number[1].n[0].n = 1; 

    while(!kbhit() && ++n < naim && digits <= MAX3DIGITS) { 
     //fprintf(stderr, "\r%i", n); 

     prev = !prev; 

     for(x = 0; x < digits; x ++) { 
      y = number[!prev].n[x].n + number[prev].n[x].n; 
      number[!prev].n[x].n = (y%1000); 
      number[!prev].n[x+1].n += (y/1000); 
     } 
     if(number[!prev].n[digits-1].n) digits ++; 
    } 

    fprintf(dg,"\nfib(%i) = %i", n, number[!prev].n[digits-2].n); 
    for(x = digits-3; x >= 0; x --) { 
     fprintf(dg,"%03i", number[!prev].n[x].n); 
    } 
    fprintf(dg,"\n"); 


    } 
    printf("sad"); 
    if(kbhit()) getche(); 
    getchar(); 
    getchar(); 
    return 0; 
} 
+0

謝謝mhcuervo :) – Semih

+0

不客氣。 – mhcuervo