为什么会出现细分错误:11?

时间:2019-11-01 15:55:48

标签: c algorithm dynamic dynamic-programming

所以我正在练习一些算法问题,但遇到了这个问题。当我输入超过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]);
    }
  }
}

这个问题也有时间限制,这就是为什么我在这里使用备忘录。

2 个答案:

答案 0 :(得分:0)

因为hitung()是递归的,所以我敢打赌,您的大量输入会导致堆栈溢出。您可以使用更大的堆栈来解决此问题。详细信息特定于您的构建环境。

答案 1 :(得分:0)

我认为long long int arr[x][10];会导致您出现段错误。如果x>10^5或100k变成100000*10*8字节或8 GB字节,则您的ram可能无法在堆栈上分配这么多空间。