任务是:
请帮忙。
BigInteger a = BigInteger.Parse(Console.ReadLine());
BigInteger b = BigInteger.Parse(Console.ReadLine());
BigInteger c = BigInteger.Parse(Console.ReadLine());
var fibonacciNumbers = new List<BigInteger> { a, b, c };
BigInteger N = BigInteger.Parse(Console.ReadLine());
if ((a < -2000000000) || (b < -2000000000) || (c < -2000000000) || (a > 2000000000) || (b > 2000000000) || (c > 2000000000) || (N > 15000) || (N < 1))
{
throw new Exception("Argument out of range");
}
while (fibonacciNumbers.Count <= N)
{
var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];
var previous3 = fibonacciNumbers[fibonacciNumbers.Count - 3];
fibonacciNumbers.Add(previous + previous2 + previous3);
}
Console.WriteLine((fibonacciNumbers[(int)N - 1]));
因为你只需要存储最后3个数字来计算下一个你不能存储所有以前的序列值。
BigInteger prevPrev = BigInteger.Parse(Console.ReadLine());
BigInteger prev = BigInteger.Parse(Console.ReadLine());
BigInteger current = BigInteger.Parse(Console.ReadLine());
BigInteger N = BigInteger.Parse(Console.ReadLine());
for(int i = 3; i < N; i++)
{
// calculate next number
var next = prevPrev + prev + current;
// shift all numbers
prevPrev = prev;
prev = current;
current = next;
}
return current;
如果我们假设你需要存储在列表前面的斐波那契结果(如果有任何的目的)?
在默认配置的CLR对象的最大大小为2GB,即使在64位。
你是存储在List
占用内存斐波纳契结果。你得到OutOfMemoryException
当你打2GB
你需要超过2GB的限制。为此,您需要添加gcAllowVeryLargeObjects
到app.config
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
在另一方面,如果你不需要斐波那契序列的所有以前的值,然后
BigInteger f2 = BigInteger.Parse(Console.ReadLine());
BigInteger f1 = BigInteger.Parse(Console.ReadLine());
BigInteger f = BigInteger.Parse(Console.ReadLine());
BigInteger N = BigInteger.Parse(Console.ReadLine());
if ((a < -2000000000) || (b < -2000000000) || (c < -2000000000) || (a > 2000000000) || (b > 2000000000) || (c > 2000000000) || (N > 15000) || (N < 1))
{
throw new Exception("Argument out of range");
}
while (fibonacciNumbers.Count <= N)
{
var fn = f2 + f1 + f;
f2 = f1;
f1 = f;
f = fn;
}
Console.WriteLine(fn);
有你的代码中的一些事情需要注意:
BigInteger
来存储计数。它可能应该安装一个32位有符号整数,因为这会已经超过2十亿迭代。随着BigInteger
结构,这将已经占用太多的内存。在当前的程序结束后,你已经转换回int
,所以没有使用BigInteger
这里。如果你想存储列表中的所有项目(不要问我为什么),那么请务必预先分配的列表中正确的号码(你知道它提前)和使用数组,所以你得到一个更高效的存储不需要重新分配和复制。
var a = BigInteger.Parse(Console.ReadLine());
var b = BigInteger.Parse(Console.ReadLine());
var c = BigInteger.Parse(Console.ReadLine());
var N = int.Parse(Console.ReadLine());
if ((a < -2000000000) || (b < -2000000000) || (c < -2000000000) || (a > 2000000000) || (b > 2000000000) || (c > 2000000000) || (N > 15000) || (N < 1))
throw new Exception("Argument out of range");
var fibonacciNumbers = new BigInteger[N];
fibonacciNumbers[0] = a;
fibonacciNumbers[1] = b;
fibonacciNumbers[2] = c;
for (var i=3; i < N; ++i)
{
var previous = fibonacciNumbers[i - 1];
var previous2 = fibonacciNumbers[i - 2];
var previous3 = fibonacciNumbers[i - 3];
fibonacciNumbers[i] = previous + previous2 + previous3;
}
Console.WriteLine(fibonacciNumbers[N - 1]);
但最好不要存储在一个阵列/列表这些项目呢。我只是想在其他问题发表意见,但请用@Vadim马丁诺夫的答案。