我正在玩這個compile time implementation。編譯處理大量數字的斐波那契
我使用ttmath.org來處理大量數據。 ttmath::UInt<SIZE>
適用於運行時間fib()
函數,但是 我不知道如何處理我的元函數的大數字,因爲我必須更改非模板參數size_t
。
#include <iostream>
#include <omp.h>
#include <ctime>
#include "ttmath/ttmath.h"
#include <type_traits>
#define SIZE 1090
// how can I use ttmath here ?
template<size_t N>
struct fibonacci : std::integral_constant<size_t, fibonacci<N-1>{} + fibonacci<N-2>{}> {};
template<> struct fibonacci<1> : std::integral_constant<size_t,1> {};
template<> struct fibonacci<0> : std::integral_constant<size_t,0> {};
// ttmath here works well at run time !
ttmath::UInt<SIZE> fib(size_t n)
{
ttmath::UInt<SIZE> a,b,c;
a = 1, b = 1;
for (size_t i = 3; i <= n; i++) {
ttmath::UInt<SIZE> c = a + b;
a = b;
b = c;
}
return b;
}
int main() {
const size_t N = 500;
if(1)
{
clock_t start = clock();
std::cout << "Fibonacci(" << N << ") = " << fib(N) << std::endl;
std::cout << "Time : " << (double)(clock() - start)/CLOCKS_PER_SEC << " s" << std::endl;
}
if(1)
{
clock_t start = clock();
std::cout << "Fibonacci(" << N << ") = " << fibonacci<N>() << std::endl;
std::cout << "Time : " << (double)(clock() - start)/CLOCKS_PER_SEC << " s" << std::endl;
}
}
結果是:
Fibonacci(500) = 139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125
Time : 0.003006 s
Fibonacci(500) = 2171430676560690477
Time : 1.5e-05 s
所以是有可能的元斐波納契提供ttmath容易嗎?或者我應該做不同的事情?
因爲ttmath可以處理比爲size_t數量大,但fibbonachi嘗試讀取爲size_t,該在你的系統上可能是64位,你不能把105位數字轉換成64位 –
Creris
是的,我知道爲什麼。我想知道我該如何解決這個問題。 – coincoin