编译环境:
Kali Linux
Ubuntu Linux
Windows 10
效果图:
解题思路:
这题方法应该有很多,我通过观察数据之间的关系找到了一种感觉比较好理解的方法。先声明一下
当输入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 人评分
C语言程序设计教程(第三版)课后习题10.1 (Java代码)浏览:1436 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:548 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:694 |
【偶数求和】 (C语言代码)浏览:556 |
【金明的预算方案】 (C++代码)浏览:934 |
大家好,我是验题君浏览:575 |
printf基础练习2 (C语言代码)浏览:503 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:696 |
剪刀石头布 (C++代码)浏览:1703 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:486 |