C++矩阵上三角化问题:对角线下方置0后输出未达预期
矩阵转上三角矩阵的C++代码问题修复
你的代码核心问题是return语句位置错误:return result;被放在了外层for循环的代码块内,导致程序处理完第一行(i=0)后就直接返回结果,后续行完全没被处理,所以输出仍是原矩阵。另外还有个潜在问题:你用n.size()同时作为行数和列数,这仅适用于方阵,若处理非方阵会出错,应该用矩阵第一行的列数(假设矩阵每行长度一致)。
修正后的代码
#include <iostream> #include <vector> using namespace std; vector<vector<int>> upper_triangle(vector<vector<int>> n) { int rows = n.size(); // 处理空矩阵,避免后续操作越界 if (rows == 0) return {}; int cols = n[0].size(); vector<vector<int>> result = n; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { // 将对角线下方的元素置0 if (i > j) { result[i][j] = 0; } } } // 所有行处理完成后再返回结果 return result; } // 测试用例 int main() { vector<vector<int>> test1 = {{10,11,12},{13,14,15},{16,17,18}}; vector<vector<int>> res1 = upper_triangle(test1); for (auto &row : res1) { cout << "{"; for (size_t k = 0; k < row.size(); k++) { cout << row[k]; if (k != row.size()-1) cout << ","; } cout << "}" << endl; } cout << endl; vector<vector<int>> test2 = {{1,2,3},{4,5,6},{7,8,9}}; vector<vector<int>> res2 = upper_triangle(test2); for (auto &row : res2) { cout << "{"; for (size_t k = 0; k < row.size(); k++) { cout << row[k]; if (k != row.size()-1) cout << ","; } cout << "}" << endl; } cout << endl; vector<vector<int>> test3 = {{1,2},{3,4}}; vector<vector<int>> res3 = upper_triangle(test3); for (auto &row : res3) { cout << "{"; for (size_t k = 0; k < row.size(); k++) { cout << row[k]; if (k != row.size()-1) cout << ","; } cout << "}" << endl; } return 0; }
关键修改点
- 将
return result;移到外层for循环外部,确保所有行都被处理后再返回结果。 - 修正列数获取逻辑:用
n[0].size()获取矩阵列数,同时增加空矩阵判断,避免数组越界。 - 添加
main测试函数,验证输出是否符合预期格式。
测试输出
{10,11,12} {0,14,15} {0,0,18} {1,2,3} {0,5,6} {0,0,9} {1,2} {0,4}
内容的提问来源于stack exchange,提问作者FieldyScop
相关产品推荐
相关产品推荐

