//fibLoop.c -- Fibonacci problem using Loop, by tsaiwn@cs.nctu.edu.tw //Please run under Dev-C++ // 注意: 這範例還用了 buffer (緩衝區) 的概念! #include #include #include // Note that some compilers NOT recognize "long long" long long fib(int n) { long long ans, f1, f2; long i; if(n<0)return 0; // 以前沒有 兔子 if(n<2)return 1; // fib(0) 與 fib(1) 都是 1 f1 = f2 = 1; for(i=2; i<=n; ++i) { // 注意從 2 開始 ans = f1 + f2; // 注意這列以及以下順序 ! f1 = f2; f2 = ans; } return ans; } /// 有感覺到 Recursive 比較簡單吧? 這用 Loop 比較難去 "想" 出正確寫法 ! void printFib(int i) { // 填滿一列再印出, 除非被要求一定印出 ( i <0 ) // 或是 i 為 10 倍數也會先印之前的再獨立印 fib(i) static char buf[88]={0}, tmp[88]; if(i<0) { printf("%s\n", buf); buf[0]=0; return; } // flush out the buffer and then return if(i!=0 && (i%10 == 0) ) { // every 10 times if(strlen(buf)!=0) printf("%s\n", buf); buf[0] = 0; printf("Fib of %d=%I64d\n", i, fib(i)); // 注意 %I64d return; } // if i%10 == 0 sprintf(tmp, "%I64d, ", fib(i)); //Dev-C++ (MINW32) if(strlen(buf) + strlen(tmp) > 78) { // 已有 >= 78 chars printf("%s\n", buf); // 給它印出去 buf[0] = 0; // 清除 成為空字串 ! (empty string) } // if length 夠了 strcat(buf, tmp); // 把 tmp 接到 buf 後面 } //printFib( int main( ) { int n, i; printf(" LONG_MAX==%ld\n", LONG_MAX); printf("0x7fffffffL==%ld\n", 0x7fffffffL); printf("n= "); scanf("%d", &n); for(i=0; i<=n; ++i) printFib(i); printFib(-1); // flush the result ! fprintf(stderr, "Hit Enter key.."); getchar( ); getchar( ); return 0; } // main( /******** D:\test> path C:\Dev-Cpp\bin;%path% D:\test> gcc fibLoop.c D:\test> a.exe *****************/