我在Hackerrank上遇到了这个问题,关于算法部分的动态编程。
系列按以下方式定义:
给定第n和第(n + 1)项,第(n + 2)th可以由 以下关系 T(n + 2)=(Tn + 1)^ 2 + T(n)
因此,如果系列的前两个术语是0和1:第三个术语 = 1 ^ 2 + 0 = 1 第四 term = 1 ^ 2 + 1 = 2 第五 term = 2 ^ 2 + 1 = 5 ......依此类推。< / p> 给出三个整数A,B和N,这样的前两个项 系列(第1和第2项)分别是A和B,计算第N个 该系列的术语。
输入格式
在一行上给出三个空格分隔的整数A,B和N.
输入约束0&lt; = A,B&lt; = 2 3&lt; = N&lt; = 20
输出格式
一个整数。该整数是给定系列的第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
如何让这个大数字适合数组?
答案 0 :(得分:0)
您的实施问题是溢出。不要被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=2
,B=2
和N=20
执行上述代码时,我会让您发现输出。
答案 1 :(得分:-1)
您必须使用BigInteger数据类型才能解决此问题。否则可能存在overflow.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);
}
}
答案 2 :(得分:-2)
您应该尝试使用Java和BigInteger类或使用Python