【问题标题】:Fibonacci Modified Hackerrank斐波那契修正 Hackerrank
【发布时间】:2016-04-21 11:24:15
【问题描述】:

关于算法部分中的动态编程,我在 Hackerrank 上遇到了这个问题。

一个系列的定义方式如下:

给定第 n 项和第 (n+1) 项,第 (n+2) 项可以通过 以下关系 T(n+2) = (Tn+1)^2 + T(n)

所以,如果系列的前两项是 0 和 1:第三项 = 1^2 + 0 = 1 第四 项 = 1^2 + 1 = 2 第五 项 = 2^2 + 1 = 5 ... 以此类推。

给定三个整数 A、B 和 N,使得 系列(第 1 项和第 2 项)分别是 A 和 B,计算第 N 系列的术语。

输入格式

在一行中给出三个空格分隔的整数 A、B 和 N。

输入约束 0

输出格式

一个整数。这个整数是给定系列的第 N 项,当 前两项分别是 A 和 B。

注意

有些输出甚至可能超出 64 位整数的范围。

我的代码如下:

int main() {
    int A,B,N;
    scanf("%d%d%d", &A, &B, &N);
    if (N == 1) {printf("%d\n", A); return 0;}
    if (N == 2) {printf("%d\n", B); return 0;}
    unsigned long long int C[3];
    C[0] = A; C[1] = B; C[2] = (B*B)+A;
    while((N-3)>0){
       C[0] = C[1];
       C[1] = C[2];
       C[2] = (C[1]*C[1])+C[0];
       N--;
    }
    printf("%llu\n", C[2]);

    return 0;
}

当我提交它时,它只通过了 2/10 的测试用例(第一个和最后一个,如果有帮助的话)。

自从我尝试使用自定义输入来查看它是否有效并且显然它有效(0 1 5 给出 5)我开始认为问题在于,正如注释所说,输出可能太大。

这是LINK 的问题

我怎样才能让这么大的数字适合数组?

【问题讨论】:

  • 使用unsigned 会提供更多空间。
  • 问题是“给定 3 个整数”,那你为什么要输入 short
  • 仔细看问题陈述的最后一行。 "有些输出甚至可能超出 64 位整数的范围。"
  • 不,不正确。该函数在第 10 次迭代时超出范围。
  • 如果您将printf 向上移动到循环中(用于测试),您会看到这个。

标签: c algorithm dynamic-programming


【解决方案1】:

您的实现问题是溢出。不要被 A、B 和 N 的小数值所迷惑。T(n) 的数字增长很快。

每当我遇到需要大整数的竞争性编程任务时,我都会使用内置支持大整数的编程语言。因此,解决此问题的一种方法是使用 Python。

第二个选项是您可以实现例程来添加和相乘大整数(对于给定的大整数表示)。这些并不难实现。

这是我的 Python 实现。

A, B, N = (int(x) for x in raw_input().split())
if N == 1: print(A)
elif N == 2: print(B)
else:
    for i in range(2, N):
        F = A + B*B
        A = B
        B = F
    print(F)

当您使用值A=2B=2N=20 执行上述代码时,我会让您发现输出。

【讨论】:

  • 我知道 T(n) 呈指数增长,在那个网站上我可以使用 Java 和 BigInteger 类,但我面临的挑战是用 C 解决问题。
  • 然后实现函数来添加/相乘大整数,例如,您可以将其实现为字符数组。如果您仍然需要帮助,请发布您的代码 :)。
  • 我在 Hackerrank 上试过你的代码,它通过了所有的测试用例。原来 0 1 20 比 C 程序计算的要大得多。
【解决方案2】:

您应该尝试使用 Java 和 BigInteger 类或 Python

【讨论】:

    【解决方案3】:

    对于这个问题,您必须使用 BigInteger 数据类型。否则可能会溢出。Java 有 BigInteger 数据类型。 这是我的java实现。

    import java.util.*;
    import java.math.*;
    public class Solution {
        public static void main(String argc[]) {
            BigInteger bi1,bi2,bi3 = null;
            Scanner in = new Scanner(System.in);
            int t1 = in.nextInt();
            int t2 = in.nextInt();
            int n = in.nextInt();
            bi1 = BigInteger.valueOf(t1);
            bi2 = BigInteger.valueOf(t2);
             for (int i=0;i<n-2;i++){
               bi3 = bi1.add(bi2.pow(2));
               bi1 = bi2;
               bi2 = bi3;
             }
        System.out.println(bi3);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2012-06-20
      • 2015-06-05
      • 2014-05-23
      • 2013-08-09
      相关资源
      最近更新 更多