C++ HW9-2 for WallPower

使用動態記憶體,計算費氏數列,並與未使用動態記憶的比較時間。
執行結果如下。
參考答案。

  1. #include <iostream>
  2. #include <time.h>
  3. using namespace std;
  4.  
  5. long long fib(long long n);
  6. long long fib2(long long n);
  7. long long num;
  8. long long *temp;
  9.  
  10. int main()
  11. {
  12. cout << "請輸入n值";
  13. cin >> num;
  14. double START, END;
  15. START = clock(); //前置time.h start紀錄開啟時間
  16. temp = new long long[num]; //將temp設成一陣列要求num個整數記憶體空間用int 輸出超過 2147483647 會出問題
  17. //大概在輸入46~48之間 改成long long 可以存15位數...
  18. for (int i = 0; i < num; i++) //清除記憶體資料為0
  19. *(temp + i) = 0;
  20. cout << fib(num - 1) << endl;
  21. delete temp; //釋放記憶體空間
  22. END = clock(); //程式結束的時間 可以把這個程式代進普通沒用記憶體儲存的遞迴 可以看時間差多少
  23. cout << (END - START) << "ms" << endl; //計算作業時間
  24. START = clock(); //普通費氏
  25. cout << fib2(num - 1) << endl;
  26. END = clock();
  27. cout << (END - START) << "ms" << endl;
  28.  
  29. system("pause");
  30. return 0;
  31. }
  32.  
  33. long long fib(long long n) //費氏記憶體遞迴
  34. {
  35. if (*(temp + n) != 0) //記憶體內如果有先前資料 回傳使用 (不用再跑一次1+1 2+1 3+2...)
  36. return *(temp + n);
  37. if (n == 0 || n == 1) //temp陣列第一數第二數為1 回傳1
  38. {
  39. *temp = 1;
  40. *(temp + 1) = 1;
  41. return 1;
  42. }
  43. return *(temp + n) = fib(n - 1) + fib(n - 2); //如果記憶體內無資料 重新算一次儲存並回傳
  44. }
  45.  
  46. long long fib2(long long n) //普通費氏遞迴 其實沒有long long的必要 但我懶的改
  47. {
  48. if (n == 0 || n == 1)
  49. return 1;
  50. else
  51. return fib2(n - 1) + fib2(n - 2);
  52. }

留言

這個網誌中的熱門文章

C# 井字遊戲