这是我已经解决的挑战,但是当我提交代码时,得分为零。当我在本地机器上运行时,它似乎产生正确的输出。我用C和Java解决了它。在java的情况下,服务器响应NZEC错误,其原因也是未知的。
输入:
第一行包含一个数字T
,它是测试用例的数量。
接下来的T
行包含3个整数X
,Y
和N
,以单个空格分隔。
输出:
对于每个测试用例,打印序列的N
个数字。
Constraints:
1) 1 <= T <= 10^6
2) 0 < N <= 50
3) 0 < X < 50
4) 0 <= Y < 3
Sample Input- Sample Output-
1 34
3 2 7
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int array[10000], x, y, z, j;
long long int testcase;
scanf("%lld", &testcase);
for (long long int v = 0; v < testcase; v++) {
scanf("%d %d %d", &x, &y, &z);
*array = (int)(calloc ((z + 100), sizeof(int *)));
for (int i = 0; i < z + 100; i++) {
array[i] = 0;
}
for (j = 0; j < x; j++) {
array[j] = y;
}
for (int l = j; l < z; l++) {
array[l] = array[l - 1] + array[l - 2] + array[l - 3];
}
printf("%d ", array[(z - 1)]);
}
return 0;
}
这是我用java编写的代码 -
public class TestClass {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long testCases = Long.parseLong(sc.nextLine());
StringBuilder sb = new StringBuilder();
for (long i = 0; i < testCases; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
int z = sc.nextInt();
int array[] = new int[z+1];
long sum = 0;
int j;
for (j = 0; j < x; j++) {
array[j] = y;
}
for (int l = j; l < z; l++) //add for loop in case of greater j values
{
array[l] = array[l - 1] + array[l - 2] + array[l - 3];
}
System.out.println (array[(z-1)] + " ");
}
}
}
答案 0 :(得分:1)
将数组声明为int *array;
将其分配为array = calloc(z + 100, sizeof(int *));
使用free(array), array = NULL;
我不知道你的算法是否正确,但是你分配内存的方式是假的,分配的内存根本就没用过,计算的大小只有10000英寸。如果您为T获得的值大于9900,则代码将显示未定义的行为。
答案 1 :(得分:0)
你的calloc中存在一个很大的问题,可能没有影响脚本的自动测试(参见chqrlie的上一个答案)。你的算法非常复杂:为什么在下一个循环覆盖它时初始化为0?为什么要在数组中分配额外的100行?
此外,您的代码存在z值较低的问题。
例如,如果x = 1,则填充数组:
array[1]=array[0]+array[-1]+array[-2];
导致堆栈溢出。
仔细查看低值,并尝试将算法理解为数学问题
在许多情况下,除非x = 1或x = 2,否则您将返回(2 ^(z-x)+1)* y。
编辑:看完您在以下链接上的更完整的帖子后,您的算法只满足x = 3:
https://codereview.stackexchange.com/questions/82295/hacker-earth-challenge-number-of-interest