我正在尝试解决Hackerrank上的这个挑战。
我遇到了一个问题,我无法继续,但我不知道我错在哪里-我希望这里有人能帮助我。
我目前的解决方案如下:
int main() {
int n,k,p,count,total;
int t[n];
scanf("%d %d",&n,&k);
for(int i = 0; i < n; i++){
scanf("%d",&t[i]);
}
p = 1;
total=0;
for(int x = 0; x < n; x++){
for(int j = 1; j <= t[x]; j++, count++){
if(count>k){
count = 1;
p++;
}
if(j==p){
total++;
}
//printf("j: %d p: %dtcount: %dn",j,p,count);
}
p++;
count=1;
}
printf("%d",total);
return 0;
}
我注释掉的printf改变了我的最终输出。例如,输入:
10 53 8 15 11 14 1 9 2 24 31
我应该得到8的答案。如果我取消注释printf()
函数,那么我可以看到当前的问题编号和页码,看看它是否"特殊"。如果我不注释它,我的最终输出是8,这就是我想要的。但是我不想把所有的迭代都打印出来。我遇到的问题是,当我删除这一行,或者把它注释掉时,输出变成了5,而不是8。是什么导致了这种变化?
在您的代码中,在定义int t[n];
时,您使用未初始化的n
。这将调用未定义行为。
详细说明,n
是一个没有显式初始化的自动局部变量,因此该变量的内容是不确定的。尝试使用不确定的值将导致UB。
引用C11
, chapter§6.7.9
如果没有显式初始化具有自动存储持续时间的对象,则其值为不确定的。[…]
和附录§J。2、未定义行为,
当对象具有自动保存时长时,使用该值不确定的
您需要将int t[n];
的定义移动到之后,您已经成功地扫描了来自用户的值。检查scanf()
的返回值,确保操作成功
数组必须为固定大小您可以在读取元素数n后使用创建calloc (), malloc ()