第五次上机
目录
前言
自己写的上机作业,可以用于参考
目前处于初步学习中,写的不好见谅
一、题目
二、解题
1.思路
将矩阵按左下到右上的对角线划为两部分
第一部分看规律发现每次向右上和左下扫描的起点分别为
0 0 向右上 c 0 给初值c=0,d=1
0 1 向左下 0 d
2 0 向右上 c+2 0
0 3 向左下 0 d+2
...
具有相似部分,可用循环解决
用一个循环用来输出第一部分的向右上和向左下的扫描并输出
第二个循环输出第二部分的向右上和向左下的扫描,n的数的奇偶影响扫描开始位置,所以考虑两种情况
n-1为奇数时 n-1为偶数时
n-1 1 向右上 n-1 0 向右上
2 n-1 向左下 1 n-1 向左下
同理用循环进行扫描输出即可
n-1 3 向右上 n-1 2 向右上
4 n-1 向左下 3 n-1 向左下
... ...
最后输出矩阵最右下角的数
2.代码
代码如下(示例):
#include<stdio.h>
int main()
{
int n,a[100][100];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
if(n==1)printf("%d",a[0][0]);//n等于1的情况
else
//将矩阵按左下到右上的对角线划为两部分
//第一部分看规律发现每次向右上和左下扫描的起点分别为
/* 0 0 向右上 c 0 给初值c=0,d=1
0 1 向左下 0 d
2 0 向右上 c+2 0
0 3 向左下 0 d+2
...
具有相似部分,可用循环
*/
//第一个循环用来输出第一部分的向右上和向左下的扫描
{
for(int x,y,b=0,c=1;b<n&&c<n;b=b+2,c=c+2)
{
x=b;
for(int j=0;x>=0;x--,j++)//向右上扫描输出的循环
{
printf("%d ",a[x][j]);
}
y=c;
for(int i=0;y>=0;i++,y--)//向左下扫描输出的循环
{
printf("%d ",a[i][y]);
}
}
//第二个循环输出第二部分的向右上和向左下的扫描,考虑两种情况
//n的数的奇偶影响扫描开始位置
/* n-1为奇数时 n-1为偶数时
n-1 1 向右上 n-1 0 向右上
2 n-1 向左下 1 n-1 向左下
同理
n-1 3 向右上 n-1 2 向右上
4 n-1 向左下 3 n-1 向左下
... ...
*/
if((n-1)%2!=0)//n-1为奇数时
{
for(int x,y,b=1,c=2;b<n&&c<n;b=b+2,c=c+2)
{
y=b;
for(int i=n-1;y<n;i--,y++)
{
printf("%d ",a[i][y]);
}
x=c;
for(int j=n-1;x<n;x++,j--)
{
printf("%d ",a[x][j]);
}
}
}
else if((n-1)%2==0)//n-1为偶数时
{
for(int x,y,b=0,c=1;b<n&&c<n;b=b+2,c=c+2)
{
y=b;
for(int i=n-1;y<n;i--,y++)
{
printf("%d ",a[i][y]);
}
x=c;
for(int j=n-1;x<n;x++,j--)
{
printf("%d ",a[x][j]);
}
}
}
}
printf("%d",a[n-1][n-1]);//最后输出矩阵最右下角的数
return 0;
}