【问题标题】:Time limit exceeded - Fibonacci超出时间限制 - 斐波那契
【发布时间】: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


【解决方案1】:

优化通常是分步骤进行的。

您从显而易见的解决方案开始。

iterate_fibs_mod10; remove_odds(n);

然后你意识到你真的只需要一个元素的昂贵模数。

nth_fib(remove_odds(n))%10;

然后您意识到,如果您可以确定性地找到保留哪个节点,则无需删除节点。

nth_fib(as_if_remove_odds(n))%10;

然后你会发现元素对应一个数学函数。

nth_fib((int)log2(n))%10;

然后你意识到这对应于二进制表示中的最高有效位。

nth_fib(msb_only(n))%10; //compiler builtins exist for most significant bit

然后你注意到,由于你只做最后一个数字,序列必须在 100 次迭代内重复(恰好是 60 次),所以你可以做一个查找表。

unsigned char fib_1s[60] = {...};
fib_1s[msb_only(n)%60];

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 2012-12-29
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2015-06-05
    • 2014-05-23
    相关资源
    最近更新 更多