【发布时间】:2017-10-18 06:59:10
【问题描述】:
我正在尝试创建一个通用的斐波那契数列,其中起始值可以是可变的,具体取决于用户想要什么。例如,它可以从 3、6 或 10、21 或用户想要的任何值开始,而不是像通常那样从值 0、1 或 1、1 开始。然后我们想要获得该系列的第 n 个值。
我尝试了 a = 10 和 b = 21 的代码,我想要一个很大的值,但它不起作用。所以我开始检查问题出在哪里。使用这些起始值:对于 n = 37、38、39,输出应分别为 405812042、656617677、1062429719。当我为值 n = 37 和 n = 38 运行代码时,两个答案都是正确的。但是,当我尝试 39 时,得到的值是:62429712。
这是我的代码:
#include <stdio.h>
int main(void)
{
unsigned long long a, b, hn, value;
int scenarios;
scanf("%d", &scenarios);
for (int i = 0; i < scenarios; i++){
scanf("%lld%lld%lld", &a, &b, &hn);
if (hn == 1)
value = a;
else if (hn == 2)
value = b;
else{
for (int j = 3; j <= hn; j++){
value = a + b;
a = b;
b = value;
}
//value %= 1000000007;
}
printf("%lld\n", value);
}
}
编辑:根据问题规范,答案应该是模块 1000000007。如果我得到第 514 个值,我得到的输出是 2903631044495864380,老实说,我不知道如何验证这个值。如果我执行 2903631044495864380 mod 1000000007,我的答案是 170447212,但根据问题,这个答案应该是 859861000。知道如何验证这一点吗?
【问题讨论】:
-
%llds 应该是%llus -
无法重现:ideone.com/aJCFKc 虽然如前所述,为 unsigned long long 指定的格式不是 lld,但代码仍按预期工作
-
一些
unsigned long long的最大值在我的机器上只有2**64 - 1,因为它们有64位。 -
您可能希望将arbitrary precision arithmetic 与GMPlib 一起使用
-
总和模 N 等于(其每个分量模 N 的总和)模 N。所以,只需保持
a和b有效模 1000000007(我是否正确计算了零?) 并将它们相加并取模 100000007 的结果。这些值相加时不会超过 2^31-1,因此 32 位算术应该是可以的。
标签: c