【问题标题】:Print nth Fibonacci number [upto 1000 digits] [closed]打印第 n 个斐波那契数 [最多 1000 位] [关闭]
【发布时间】:2013-10-27 07:36:17
【问题描述】:

如何在 C/C++ 中计算第 n 个斐波那契数?斐波那契数最多可包含 1000 位数字。我可以生成高达 2^64 的数字(无符号长长)。由于这是数量的限制,所以我猜测必须有其他方法 - 我不知道。

编辑:

此外,它必须在不使用任何外部库的情况下完成。

【问题讨论】:

标签: c++ c fibonacci


【解决方案1】:

我会给出一些提示,因为你还没有表明你已经开始了。

一千位数很多。比 C 或 C++ 中的任何内置数字类型都多。

解决它的一种方法是使用任意精度的数学库。这将具有结构,基本上可以为您提供任意数量的数字。

另一种方法是滚动你自己的缓存和携带:

unsigned short int term1[1024];  // 1024 digits from 0-9
unsigned short int term2[1024];  // and another

unsigned short int sum[1024];    // the sum

addBigNumbers(&term1, &term2, &sum);   // exercise for the reader

我希望addBigNumbers 的算法是这样的:

Start at the ones digit (index 0)
Add term1[0] and term2[0]
Replace sum[0] with the right digit of term1[0] + term2[0] (which is ... ?)
Keep track of the carry (how?) and use it in the next iteration (how?)
Repeat for each digit

现在,由于您正在计算斐波那契数列,您将能够重复使用这些大数字来计算数列中的下一项。您可能会发现,最好不要复制它们,而只需更改哪些是术语,哪些是重复调用addBigNumbers 的总和。

【讨论】:

  • 所以在创建了这个添加函数之后,我应用了基本的斐波那契公式:a=1, b=1; a+=b; b+=a; ?
  • 更像:a = 1、b = 1、c = a + b、a' = b + c、b' = c + a' 等
  • @John: unsigned int,存储单个数字? char 更合适,尽管我可能会尝试减半 ;-)
  • @Jongware 绝对正确,如果我正在实施它,我也会这样做。如果 C 或 C++ 有一个名为 byte 的类型,我会在心跳中使用它。但是出于教学目的,我觉得使用unsigned short int比需要解释更清楚:“您实际上存储的是值为0的char,而不是字符'0'......但你可以 如果你想存储字符,你只需要记住从 ASCII 值中减去 48 来得到实际的数字……”明白我的意思吗? :) 是的,我在浪费空间,但如果他/她需要,我会让 OP 进行优化。 :)
【解决方案2】:

您可以尝试将GMP 用于任意大的整数。

【讨论】:

  • 我现在更新了这个问题。它必须在不使用任何外部库的情况下完成。
猜你喜欢
  • 2020-03-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多