【发布时间】:2020-01-10 16:56:12
【问题描述】:
列表中有“n”个斐波那契数,其中“n”由用户提供。读完后,用 10 取 mod 来修改数字(例如,如果我读 2 那么它应该修改为 2%10 即 2,如果它是 13 那么它应该是 13%10 即 3)。然后,删除每个奇数-从该列表中定位的数字(1, 3, 5...定位的项目),直到您只剩下一个项目。
我已经解决了这个问题。但是,问题是我收到了 TLE 错误。我试过缩短代码,但仍然可以在一秒钟内完成。
#include <stdio.h>
#include <math.h>
int fib(int n)
{
if(n == 0 || n == 1)
{
return n;
}
else
{
return(fib(n-1)+fib(n-2));
}
}
int main()
{
int ip, d, i=0, j, n;
scanf("%d", &n);
for(j=0; j<n; j++)
{
scanf("%d", &ip);
if(ip == 1)
{
printf("0\n");
}
else if(ip == 2)
{
printf("1\n");
}
else if(ip == 4)
{
printf("2\n");
}
else
{
while(1)
{
d = pow(2, i++);
if(d >= ip)
{
d = pow(2, i-2);
break;
}
}
printf("%d", fib(d-1)%10);
}
i = 0;
}
}
【问题讨论】:
-
正文下面的例子似乎不正确。 11 不是斐波那契数。
-
TLE 意味着您的程序运行时间过长。也许如果你记得你计算的最后两个数字,你可以不用从头开始计算下一个。
-
@g_bor 抱歉,应该分别是 13 和 21。
-
另请注意,剩余的数字仅取决于长度,而不取决于任何值。你能猜出你必须输出的数字的索引吗?
-
@g_bor 它会根据不同的输入而有所不同。现在,如果我输入否。测试用例为 1,然后输入 23,然后将 23 个斐波那契数输入到列表中。然后我删除 (1st, 3rd, 5th ...) 每个奇数节点。现在,我有一个新的清单。由此,我必须重复这个过程,直到剩下一个节点。这样,我得到 0 作为最后一个剩余节点。
标签: c linked-list fibonacci