cpython3


私信TA

用户名:smartZhou

访问量:71636

签 名:

等  级
排  名 36
经  验 12935
参赛次数 1
文章发表 99
年  龄 0
在职情况 学生
学  校
专  业 计算机科学与技术

  自我简介:

TA的其他文章

编译环境:

Kali Linux 

Ubuntu Linux

Windows 10 

效果图:

微信图片_20181224153041.png

解题思路:

这题方法应该有很多,我通过观察数据之间的关系找到了一种感觉比较好理解的方法。先声明一下

 当输入5进行测试时,输出

1   3  6  10  15

2   5  9   14

4   8  13 

7   12 

11 

输出的第一行1 3 6 10 15 。如果用二维数组存储的话,第一行的数据的行标都是0哟,如a[0][1]  a[0][2]  a[0][3]等。a[0][0]=1,a[0][1]=a[0][0]+2,a[0][2]=a[0][1]+3,a[0][3]=a[0][2]+4......

所以可以给第一行的数据先赋值。

//二维数组第一行元素赋值
int temp=2;  a[0][0]=1;
for(int i=0; i<N; i++)
{
        a[0][i]=a[0][i-1]+temp;
        temp+=1;   
}

从第二行元素开始,每个元素的值等于其右上角元素值-1。即a[i][j]=a[i-1][j+1]-1

1   3  6  10  15

2   5  9   14

4   8  13 

7   12 

11

如看上图中2和3的关系 a[1][0]=a[0][1]-1等。



注意事项:
需要注意的问题就是如何让输出的是一个矩阵的左上角

当输入5时,输出5X5的矩阵的左上角。

左上角的元素的下标如下

00 01 02 03 04

10 11 12 13 

20 21 22 

30 31 

40

发现矩阵左上角的元素的下标之和都是小于等于矩阵两条对角线交点的a[2][2]的下标之和。

a[N][N]矩阵中间点的下标之和为 (N+N-2)/2 

所以输出矩阵的左上角满足的条件是 i+j<=(N+N-2)/2;


关于二维数组的使用:

(1)使用一个足够大的二维数组可存储数据(最简单)。

(2)使用指针动态开辟二维数组

(3)C++ Vector容器创建"二维数组"

先来说一下第(3)种:

如果开辟M行N列

则语法如下:

vector<vector<int> > vecInt(M,vector<int>(N));
注意> >之间有空格,不然会被认为是>>运算符重载。

第(2)种

int **p=(int*)malloc(sizeof(int**)*M);
for(int i=0; i<M; i++)
{
        a[i]=(int*)malloc(sizeof(int*)*N);
}

参考代码:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	int N,temp=2;
	cin>>N;
	//vector容器开辟二维数组
	vector<vector<int> > a(N,vector<int>(N));
	a[0][0]=1; 
	for(int j=1; j<N; j++)
	{	
		a[0][j]+=a[0][j-1]+temp;
		temp+=1;
	}
	for(int i=1; i<N; i++)
	{
		for(int j=0; j<N; j++)
		{
			if(i+j<=(N+N-1)/2)  //矩阵左上角
			{
				a[i][j]=a[i-1][j+1]-1;
			}
		}
	}
	for(int i=0; i<N; i++)         //输出
	{
		for(int j=0; j<N; j++)
		{
			if(i+j<=(N+N-1)/2)  
			{
				cout<<a[i][j]<<" ";
			}
		}
		cout<<endl;
	}
	return 0;
}


 

0.0分

4 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区