c ++测试程序中的非法系统调用(对角矩阵元素程序的总和)

时间:2018-05-11 18:02:22

标签: c++ math matrix algebra diagonal

我刚刚开始学习编程,所以我要求你的理解;)检查程序只接受几个测试,其余的抛出错误非法系统调用,我不知道如何&# 34;咬它"。

任务:(注意,程序应该节省内存)编写一个程序,它将在方阵中找到一个对角线具有最大元素对角线的对角线(仅右侧)。就像在图片中一样 https://i.stack.imgur.com/Cex9o.jpg

MAX TIME:1s,MAX内存使用3MB; 输入: 在第一行中有一个自然数n(不大于1000)表示矩阵A的大小。在以下n行的每一行中都有一个n个整数的序列(范围-10000..10000) - 这些是矩阵A的下一行的元素。

输出: 你应该写两个数字:

*对角矩阵A的数量,具有最大的元素总和(如果有多个这样的数字,则应打印最小的数字), *这笔金额的价值。

像这样: https://i.stack.imgur.com/bM7AP.jpg

我怀疑该程序超过了所需的3MB内存,所以它没有通过一些测试并抛出非法的系统调用错误。我不知道如何更好地解决这个问题所以请帮助我;)

#include <iostream>

using namespace std;

int main(){
    short length;
    short counter=0;
    short which=0;
    int largest_sum=-10000000;
    int sum=0;

    cin>>length;
    //matrix declaration
    short **matrix = new short*[length];

    for(short row=0; row<length; row++){
        matrix[row] = new short [length];
    }
    //filling the matrix
    for(short row=0; row<length; row++){
        for(int column=0; column<length; column++){
            cin>>matrix[row][column];
        }
    }
    //calculating the sum of diagonals and choosing the largest one (half of all diagonals)
    for(short row=length-1; row>=0; row--){
        short r=row;
        short c=0;
        while(r<length){
            sum+=matrix[r][c];
            r=r+1;
            c=c+1;
        }
        ++counter;

        if(sum>largest_sum){
            largest_sum=sum;
            which=counter;
        }
        sum=0;
    }
    //calculating the sum of diagonals and choosing the largest one (second half of all diagonals)
    for(short row=1; row<length; row++){
        short r=0;
        short c=row;
        while(c<length){
            sum+=matrix[r][c];
            r=r+1;
            c=c+1;
        }
        ++counter;
        if(sum>largest_sum){
            largest_sum=sum;
            which=counter;
        }
        sum=0;
    }
    //removing from memory
    for(short i=0; i<length; i++){
        delete [] matrix[i];
    }
    delete [] matrix;
    //score
    cout<<which<<" "<<largest_sum;

    return 0;
}

我的代码:https://ideone.com/6Qd1yF

1 个答案:

答案 0 :(得分:1)

改善当前解决方案的一些提示:(内存消耗~2 MB)

  • 使用std :: vector或std :: array(您不需要new和delete)
  • 创建一个单独的函数,您可以在其中给出第一个元素的坐标并获得对角线和

替代解决方案:(内存消耗~10 kB)

  • 如果你仔细观察,你会发现每个条目只对一个对角线有贡献
  • 想象一个函数,它为您提供每对坐标的对角线数
  • 在读取矩阵时,只需将该值添加到其对应对角线的总和(您不需要存储实际矩阵)
  • 最终选择了最大的金额