所以我正在练习一些算法问题,但遇到了这个问题。当我输入超过800k的输入时,它将显示段错误:11。因此,输入格式为:
number of input
input1
input2
...
,结果应为从0到9的数量,即从1到输入的数字。例如,如果输入为10,则存在1个数字0、2个数字1、1个数字2、1个数字3、1的数字4,依此类推,直到9。这是我的代码存在的问题,如果我没有输入超过200k左右的东西,它就可以正常工作。
#include <stdio.h>
void coba(long long int arr[], long long int y)
{
while(y)
{
arr[y%10]++;
y/=10;
}
}
void hitung(long long int arr[], long long int y,long long int limit)
{
if(y>limit)
{
coba(arr, y);
hitung(arr, y-1,limit);
}
}
int main()
{
int x,m;
scanf("%d",&x);
long long int a[x];
long long int arr[x][10];
for(int i = 0; i<x; i++)
{
scanf("%lld",&a[i]);
for(int j = 0; j<10; j++)
arr[i][j]=0;
}
for(int i = 0; i<x; i++)
{
m=1;
printf("Case #%d: ",i+1);
if(i)
{
for(int j = i-1; j>=0; j--)
{
if(a[i]>a[j])
{
hitung(arr[j], a[i], a[j]);
for(int k = 0; k<9; k++)
{
arr[i][k]=arr[j][k];
printf("%lld ",arr[i][k]);
}
arr[i][9]=arr[j][9];
printf("%lld\n",arr[i][9]);
m=0;
break;
}
}
if(m)
{
hitung(arr[i], a[i], 0);
for(int k = 0; k<9; k++)
{
printf("%lld ",arr[i][k]);
}
printf("%lld\n",arr[i][9]);
}
}
else
{
hitung(arr[i], a[i], 0);
for(int k = 0; k<9; k++)
{
printf("%lld ",arr[i][k]);
}
printf("%lld\n",arr[i][9]);
}
}
}
这个问题也有时间限制,这就是为什么我在这里使用备忘录。
答案 0 :(得分:0)
因为hitung()
是递归的,所以我敢打赌,您的大量输入会导致堆栈溢出。您可以使用更大的堆栈来解决此问题。详细信息特定于您的构建环境。
答案 1 :(得分:0)
我认为long long int arr[x][10];
会导致您出现段错误。如果x>10^5
或100k变成100000*10*8
字节或8 GB字节,则您的ram可能无法在堆栈上分配这么多空间。