PTA第一节 矩阵四边元素之和
:heartpulse::heartpulse::heartpulse: 让我们认真刷题,刷透C语言
一、题目描述
:warning::warning::warning: 直接看题目
==输入样例:==
10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
==输出样例==
198
二、题目分析
通过分析题目中给的条件和要求,很容易看出来这不是一道难题,但是有没有一种简单高效的方法,使我们解决这个问题就是我们应该关注的点了:bike::bike::bike:
从我圈出来的地方大家可以看到,我们需要求出四个边上的元素之和。换种说法,就是要去求矩阵最外面那一圈元素之和。了解到题目的要求后,我们就可以着手开始做题啦。
三、解决思路
## 1、思路一:直接计算
既然题目要求对nn矩阵的四周元素进行求和,那么,==我们就进行递归,第一行的元素全部求和,2到n-1行只加第一列和最后一列,最后一行也是全部求和==,这样就可以求出结果,
但这样计算不仅递归次数多,如果是一个比较小的n看不出来时间复杂度的差距,但当n取1000,10000这样的代码是不堪一击的,甚至都无法写出完整的代码.:new_moon_with_face::new_moon_with_face::new_moon_with_face:
2、间接计算
题目已经告诉了我们要求最外面一圈的元素之和.我在这里给大家介绍一种简介的办法,不管n取多大,都能够游刃有余.
==我们可以分两步进行计算,先计算整个矩阵的元素之和,在计算除去最外层元素的矩阵之和,然后做差就可以得到最外层元素之和==
这种方法为我们节省了很多步骤,甚至写了输入之后,后面直接就是复制粘贴,改一下循环的条件,使得这个题目解决起来变得十分的方便.
四、代码实现
## 1、思想一代码实现
由于第一种方法太过于繁杂,在次我以一个5*5的矩阵的核心代码演示一下即可,感兴趣的小伙伴们可以自己下去试一下其他的.
for(i = 0;i < n;i++)
{
if(i == 0)
{
for(j = 0;j < n;j++)
sum += a[i][j];
}
if(i == 1 || i == 2 || i == 3)
{
sum = sum + a[i][0] + a[i][4];
}
if(i == 4)
{
for(j = 0;j < n;j++)
sum += a[i][j];
}
}
## 2、思想二代码实现
定义三个变量,==j记录整个矩阵的元素之和,k记录除了最外层元素之和,sum记录j-k==,话不多说,直接看核心代码:point_down::point_down::point_down:
int sum(int (*a)[N],int n){
int i,j,sum=0,k=0,t=0;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
j+=a[i][j];
}
}
for(i=1; i<n-1; i++)
{
for(j=1; j<n-1; j++)
{
k+=a[i][j];
}
}
sum=j-k;
return sum;
}
总结
希望大家能够多多支持,你们的三连就是我最大的动力.最近发烧被隔离了,有那里写的有争议,还请各位大神指点出来.