【发布时间】: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