问题描述:
已知一个n*n的矩阵(方阵n<=100),把矩阵主副对角线上的元素值加上x,然后输出这个新矩阵。
输入格式:
一行两个变量,用空格隔开,代表n和x
输出格式:
输出新矩阵,每个数字5个宽度占位符,右对齐输出
输入样例1:
3 4
1 2 3
1 2 3
1 2 3
输出样例1:
5 2 7
1 6 3
5 2 7
问题分析
我们知道主对角线上元素的下标满足行号(i)与列号(j)相等;次对角线上元素的下标满足行号(i)与列号(j)的和是定值n+1。从而循环遍历二维数组,判断如果元素在主对角线或者次对角线上,那么累加x。
如果数组元素为a[i][j],矩阵输出语句表述为“print("号d",a[i][j]);”,其默认为左对齐。而题目中要求输出时矩阵元素场宽为5,回顾第二章第三节中print函数的使用,则输出语句表述为“print("号5d",a[i][j]);”,元素输出时右对齐。输出元素场宽为5,如果输出元素的位数小于5,左边补足空格,如果输出元素的位数大于5,则打印所有的数字,不会截断;此外,“_”表示左对齐,在数字宽度前面加上“_”号即可,如果题目要求输出矩阵元素左对齐时,则需要修改为“print("号-5d",a[i][j]);”。
代码
#include<bits/stdc++.h>
using namespace std;
int a[11000][11000],n,i,j,x;
int main(){
cin>>n>>x;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)scanf("%d",&a[i][j]);
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(j==i||(i+j==n+1))a[i][j]+=x;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)printf("%5d",a[i][j]);
printf("\n");
}
return 0;
}
OK