【题目链接】:https://nanti.jisuanke.com/t/25084
【题目描述】:给你一个 n×n 的矩阵,里面填充 1到 n x n。例如当 n 等于 3 的时候,填充的矩阵如下。
1 2 3
4 5 6
7 8 9
现在我们把矩阵中的每条边的中点连起来,这样形成了一个新的矩形,请你计算一下这个新的矩形的覆盖的数字的和。比如,n = 3 的时候矩形覆盖的数字如下。
2
4 5 6
8
那么当 n 等于 101 的时候,矩阵和是多少?
答案:
26020201
思路:
其中彩色部分为所求区域,我的思路是将彩色部分分成四部分,分别为左上,右上,左下,右下。四部分相加即可得到结果,其中粉色部分共加了两次,黑色部分共加了四次,因此要减去一次粉色部分再减去的过程中也减去了两次黑色部分,还要再减去一次黑色部分。
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = 1;
int m = scanner.nextInt();
int[][] arr = new int[120][120];
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
arr[i][j]=n;
n++;
}
}
int sum = 0;
/* 左上部分求和 */
for(int i=1;i<=(m+1)/2;i++){
for(int j=(m+1)/2;j>(m+1)/2-i;j--){//3, 3 2, 3 2 1
sum+=arr[i][j];
}
}
/* 右上部份求和 */
for(int i=1;i<=(m+1)/2;i++){
for(int j=(m+1)/2;j<(m+1)/2+i;j++){//3, 3 4, 3 4 5
sum+=arr[i][j];
}
}
/* 左下部分求和 */
for(int i=(m+1)/2;i<=m;i++){
for(int j=i-(m+1)/2+1;j<=(m+1)/2;j++){//1, 1 2, 1 2 3
sum+=arr[i][j];
}
}
int k=m;
/* 右下部分求和 */
for(int i=(m+1)/2;i<=m;i++){
for(int j=(m+1)/2;j<=k;j++){//3, 3 4, 3 4 5
sum+=arr[i][j];
}
k--;
}
/* 求和时位于中点的两条线共加了两遍,因此要减去中间两条线的和 */
int sum1 = 0;
for(int i=1;i<=m;i++){
sum1+=arr[(m+1)/2][i]+arr[i][(m+1)/2];
}
/* 矩阵最中间的点共加了4遍,减去的两条边中有两遍,因此再减去一遍 */
System.out.println(sum-sum1-arr[(m+1)/2][(m+1)/2]);
}
}
来自于:https://blog.csdn.net/mcp3128/article/details/79695030