【问题标题】:runtime error (SIGABRT) - SPOJ运行时错误 (SIGABRT) - SPOJ
【发布时间】:2016-03-31 14:15:21
【问题描述】:

我的代码在代码块中运行良好,但是当我提交时显示runtime sigabrt 错误,这个错误是什么意思?

当我将指针数组的大小初始化为 200 时,它工作正常,但我想知道这是什么错误?

问题链接是:http://www.spoj.com/problems/FCTRL2/

代码如下:

    #include <iostream>


    using namespace std;
    void multiply(int x,int *nums,int &len){
        int carry=0;
        int prod;
        for (int j=0;j<len;j++){
            prod=nums[j]*x+carry;
            carry=prod/10;
            nums[j]=prod%10;
        }
        while (carry){
            nums[len]=carry%10;
            carry=carry/10;
            len++;
        }

   }


   int main()
   {
   int t,n;

   cin>>t;
   int arr[100];
   for (int i=0;i<t;i++){
         cin>>arr[i];
   }
   for (int i=0;i<t;i++){
         n=arr[i];
         if (n==0){cout<<0<<endl;}
         else{
        int *nums= new int[0];
        nums[0]=1;
    int len=1;
    for (int i=2;i<=n;i++){
        multiply(i,nums,len);

    }


    for (int i=len-1;i>=0;i--){

        cout<<nums[i];

    }
    cout<<endl;}
}
return 0;
}

【问题讨论】:

  • int *nums= new int[0]; nums[0]=1; -- 要么你没有看到这个明显的错误,要么你只是在写代码而不是学习语言,只是为了提交给 SPOJ。
  • 不,先生,我在问这个 sigabrt 是什么类型的错误......以及它与 nums[0] 的关系
  • 您正在创建一个 0 元素缓冲区,因此访问 nums 中的任何元素,包括元素 0,都是未定义的行为。

标签: c++ factorial


【解决方案1】:

int *nums = new int[0]; 更改为int *nums = new int[x],其中x 是数组的最大大小(取决于您期望的阶乘位数)。根据约束 (1 &lt;= n &lt;= 100) 一个合适的值为xwould be158

int *nums = new int[n]n 元素数组分配内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 2015-09-30
    • 2017-11-12
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多