// 請看看K&R課本附錄 B.10 並仔細研究這程式, 請用很多 n 值測試, 並到bb寫報告! // 注意課本上寫說 difftime( )是以秒為單位是錯的! 它仍是以 tick 為單位! //clock.c -- by tsaiwn@csie.nctu.edu.tw //test using clock( ) function through calling Fibonacci //====== 電腦很快, 但是若要做的事情很多很多, 還是會感覺很慢 ! #include #include #include //第0個月有一對小兔子, 每月會長大, 大兔每月會生出一對, 請問第n月有幾對? long long fib(int n) { // recursive version, very SLOW ! if(n<0) return 0; if(n<2) return 1; return fib(n-1) + fib(n-2); //當 n > 50 你就會感覺很慢 } // fib // 如上的 Recursive version 很好寫, 但因會叫用很多次, 會很慢 ! // === 以下改用 Iteration 方式則會很快很快! long long fib22(int n) { // Iteration version using for LOOP int i; long long f[999]={1, 1, 0}; // 第0個月與第一個月是 1 for(i=2; i<=n; ++i) f[i] = f[i-1] + f[i-2]; return f[n]; } // fib22 int main( ) { static char buf[999]; long long ans; long long before, after, start, end, total; double elapsed; // 用來算跑了幾秒? int n, w; // 聽說 w 在籃球火 :-) 若 w 是 3388 則用 fib22( ) printf("CLK_TCK=%f\n", (double)CLK_TCK ); printf("CLOCKS_PER_SEC=%f\n", (double)CLOCKS_PER_SEC ); printf("About to compute Fibonacci number..\n" " You can TRY n=19,35,36,37,38,45,46,49, 90,91,92\n"); printf("fib is a recursive version, fib22 uses LOOP.\n"); printf("Enter 3838 for calling fib22, or I will call fib: "); fgets(buf, sizeof(buf), stdin); // 讀入字串到 buf w = atoi(buf); printf("\n n=? "); fgets(buf, sizeof(buf), stdin); n = atoi(buf); if(n==0) n = 19; // 按 ENTER 算 19 :-) printf(" ..calling fib%s(%d)...", w==3388?"22":"", n); before = time(0); start = clock(); if(w==3388) ans =fib22(n); else ans = fib(n); //try n=19,30,36,37,38,45,46,49,90,91,92 end = clock(); after = time(0); printf("...return from fib(%d)\n\n", n); total = end - start; elapsed = (double)total/CLOCKS_PER_SEC; // in seconds // DEV-C++ 底層是使用 GNU 的 MINGW32 gcc/g++ #ifdef __MINGW32__ printf("Before call, time(0)=%I64d\n", before); printf(" After call, time(0)=%I64d\n", after); #else printf("Before call, time(0)=%lld\n", before); printf(" After call, time(0)=%lld\n", after); #endif printf("\nfib%s(%d)= ", w==3388?"22":"", n); //w是3388則是fib22 #ifdef __MINGW32__ printf("%I64d\n", ans); printf("\nTime used: %I64d ticks =", total); #else printf("%lld\n",ans); printf("\nTime used: %lld ticks =", total); #endif printf("== %f seconds.\n", elapsed); printf("Lib function difftime(t2, t1)=%f\n", difftime(end, start) ); // 其實它只是做減法 ! printf(" What is the unit of difftime()?\n"); // tick 滴答 printf(" Hit ENTER key .."); getchar( ); return 0; } // main