我正在尝试解决Hackerrank Find Digits问题,并收到涉及数组问题的运行时错误。我尝试释放阵列内存空间,但是仍然相同。我要进行哪些更改?
我尝试通过常规方式以及使用malloc函数声明数组。
#include <bits/stdc++.h>
using namespace std;
int main() {
int testCase,rem,count[]={0},n;
scanf("%d", &testCase);
int *numbers = (int*) malloc(testCase*sizeof(int));
for(int i=0; i<testCase; i++)
scanf("%d",numbers + i);
for(int i=0; i<testCase; i++) {
n = *(numbers + i);
while(n!=0) {
int q = n % 10; //get the units place
rem = *(numbers + i) % q; //find remainder
if(rem == 0)
count[i]++;
n/=10;
}
}
free(numbers);
for(int i=0; i<testCase; i++)
printf("%d", count[i]);
free(count);
return 0;
}
答案 0 :(得分:1)
从注释中可以注意到,count
数组从一开始就隐式设置为仅包含1个元素。此外,这不是导致您出现运行时错误的唯一问题。
如果使用算子模数(%),则必须确保不除以零,否则将得到浮点异常-rem = *(numbers + i) % q;
我还建议您使用C ++或C,因为您将两者结合在了代码中,并且认为这是不切实际的。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
int testCase,rem,n;
scanf("%d", &testCase);
int *numbers = (int*) malloc(testCase*sizeof(int));
int *count= (int*) malloc(testCase*sizeof(int));
for(int i=0; i<testCase; i++) {
scanf("%d",numbers + i);
count[i] = 0;
}
for(int i=0; i<testCase; i++) {
n = *(numbers + i);
while(n!=0) {
int q = n % 10; //get the units place
if (q == 0) {
n /= 10;
continue;
}
rem = *(numbers + i) % q; //find remainder
if(rem == 0)
count[i]++;
n/=10;
}
}
free(numbers);
for(int i=0; i<testCase; i++)
printf("%d", count[i]);
free(count);
return 0;
}
答案 1 :(得分:0)
//我没有更正代码以打印适当的计数。我刚刚建议了为什么会出现运行时错误
当使用malloc / realloc分配内存时,应使用free
内存尚未分配为动态计数,因此请勿使用free(count)。
也不需要在第一行中使用该标头。下面的PFB代码
#include <stdio.h>
int main() {
int testCase,rem,count[]={0},n;
scanf("%d", &testCase);
int *numbers = (int*) malloc(testCase*sizeof(int));
for(int i=0; i<testCase; i++)
scanf("%d",(numbers+i));
for(int i=0; i<testCase; i++)
printf("%d\n",numbers[i]);
for(int i=0; i<testCase; i++) {
n = *(numbers + i);
while(n!=0) {
int q = n % 10; //get the units place
rem = *(numbers + i) % q; //find remainder
if(rem == 0)
count[i]++;
n/=10;
}
}
free(numbers);
for(int i=0; i<testCase; i++)
printf("%d", count[i]);
return 0;
}