知识补充:关于等差数列1+2+3+....+n的求和公式
理解1:
a1=1,d=1,项数为n,求和s(n)=n*a1+1/2*n*(n-1)d
=1/2*n*(n+1);
理解2:
首尾结合,第一项+倒数第一项=n+1;
第二项+倒数第二项=n+1;
第三项+倒数第三项=n+1;
......
共有n/2个这样的组合,所以求和s=n/2*(n+1);
1.求对称矩阵存储在一维数组的数组下标
设数组s下标为k,其中某个元素在二维数组a的数组下标为(i,j),
说明该元素是二维数组的第(i+1)行,第(j+1)列,(两个数组下标均从0开始)。
则在该元素之前有i行,(对于每一行来说,是第几行就有几个元素),
在该元素之前,有k=1 + 2 + ... + i +j 个元素,
k=1/2*i*(i+1)+j
(此时i就相当于等差数列的n,元素为等差数列的第i项)
该元素在一维数组的位置是第k+1个,下标为k
代码实现:
#include<iostream>
using namespace std;
int main()
{
int a[5][5] = { 3,6,4,7,8,6,2,8,4,2,4,8,1,6,9,7,4,6,0,5,8,2,9,5,7 };
int n = 5,k = 0,b[15];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
{
k = i * (i + 1) / 2 + j;
b[k] = a[i][j];
}
for (int i = 0; i < n * (n + 1) / 2; ++i)
cout << b[i] << " ";
return 0;
}