大佬教程收集整理的这篇文章主要介绍了c – 我想使用大整数值确定序列中的第n个Fibonacci项,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#define MOD %10000 unsigned long long calc(long nth) { return (pow( 1 + sqrt(5),nth ) - pow( 1 - sqrt(5),nth )) / (pow(2.0,nth)*(sqrt(5))); } int main() { long t,nth; for (std::cin>>t; t-- && std::cin>>nth; ) { std::cout<<calc(nth-2)MOD<<" "<<calc(nth-1)MOD<<" "<<calc(nth)MOD<<std::endl; } return 0; }
为了加快算法速度,您可以使用快速加倍的Fibonacci:
F(2k) = F(k)[2F(k+1) - F(k)] F(2k+1) = F(k+1)^2 + F(k)^2
应用模数算法,您最后的最快算法将是:
F(2k) = F(k)[2F(k+1) - F(k)] % 10000 F(2k+1) = (F(k+1)^2 + F(k)^2) % 10000
使用这种方法,您的函数永远不会超过10000,因此int类型就足够了.
编辑:好的,我在星期五晚上有一些空闲时间(我猜不是一件好事)并实施了算法.我实现了两个版本,第一个是O(1)内存和O(lg n)时间复杂度,第二个是使用缓存,内存和最坏情况运行时为O(lg n),但最好的情况是O运行时(1).
#include <iostream> #include <unordered_map> using namespace std; const int P = 10000; /* Fast Fibonacci with O(1) memory and O(lg n) time complexity. No cache. */ int fib_uncached (int n) { /* find MSB position */ int msb_position = 31; while (!((1 << (msb_position-1) & n)) && msb_position >= 0) msb_position--; int a=0,b=1; for (int i=msb_position; i>=0;i--) { int d = (a%p) * ((b%p)*2 - (a%p) + p),e = (a%p) * (a%p) + (b%p)*(b%p); a=d%P; b=e%P; if (((n >> i) & 1) != 0) { int c = (a + b) % P; a = b; b = c; } } return a; } /* Fast Fibonacci using cache */ int fib (int n) { static std::unordered_map<int,int> cache; if (cache.find(n) == cache.end()) { int f; if (n==0) f = 0; else if (n < 3) f = 1; else if (n % 2 == 0) { int k = n/2; f = (fib(k) * (2*fib(k+1) - fib(k))) % P; } else { int k = (n-1)/2; f = (fib(k+1)*fib(k+1)+ fib(k) * fib(k)) % P; } if (f<0) f += P; cache@R_673_11199@ = f; } return cache.at(n); } int main () { int i ; cin >> i; cout << i << " : " << fib(i) << endl; return 0; }
无缓存实现的参考:https://www.nayuki.io/page/fast-fibonacci-algorithms
以上是大佬教程为你收集整理的c – 我想使用大整数值确定序列中的第n个Fibonacci项全部内容,希望文章能够帮你解决c – 我想使用大整数值确定序列中的第n个Fibonacci项所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。