c++测试程序中的非法系统调用(对角矩阵元素求和程序)
illegal syscall in c++ testing program (the sum of the diagonal matrix elements program)
我刚开始学习编程,所以我希望得到你的理解;)检查程序只接受一些测试,其余的会抛出错误非法系统调用,我不知道如何"bite it".
任务:(注意,该程序应该是节省内存的)编写一个程序,将在方阵中找到对角线元素和最大的对角线(仅对角线)。就像在图片中
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;
}
改进当前解决方案的一些提示:(内存消耗 ~ 2 MB)
- 使用std::vector或std::array(此时不需要新建和删除)
- 创建一个单独的函数,在其中给出第一个元素的坐标并获得对角线和
备选方案:(内存消耗~10 kB)
- 如果仔细观察,您会发现每个条目仅对其中一条对角线有贡献
- 想一个函数,它给出每对坐标的对角线数
- 读取矩阵时,只需将值与其对应的对角线之和相加即可(不需要存储实际矩阵)
- 最后取最大的和
我刚开始学习编程,所以我希望得到你的理解;)检查程序只接受一些测试,其余的会抛出错误非法系统调用,我不知道如何"bite it".
任务:(注意,该程序应该是节省内存的)编写一个程序,将在方阵中找到对角线元素和最大的对角线(仅对角线)。就像在图片中 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;
}
改进当前解决方案的一些提示:(内存消耗 ~ 2 MB)
- 使用std::vector或std::array(此时不需要新建和删除)
- 创建一个单独的函数,在其中给出第一个元素的坐标并获得对角线和
备选方案:(内存消耗~10 kB)
- 如果仔细观察,您会发现每个条目仅对其中一条对角线有贡献
- 想一个函数,它给出每对坐标的对角线数
- 读取矩阵时,只需将值与其对应的对角线之和相加即可(不需要存储实际矩阵)
- 最后取最大的和