若对称矩阵 AnXn按行顺序压缩存储,只存下三角到 一维数组 b 中,则 b 的元素个数是 ,元素 aij 在 b 中的下标是 。
时间: 2023-07-14 08:13:22 浏览: 128
对称矩阵 AnXn 的下三角(包括对角线)中的元素个数是 (n+1)*n/2,因为对称矩阵中,第 i 行第 j 列和第 j 行第 i 列的元素是相等的,只需要存储其中一个即可,因此只有下三角(包括对角线)中的元素需要存储,共有 (n+1)*n/2 个元素。
将下三角按行顺序压缩存储到一维数组 b 中,需要按照以下方式计算元素在 b 中的下标:
- 先计算该元素在矩阵中的行列坐标:对于下标 k,其所对应的元素在矩阵中的行号为 i = floor((sqrt(8*k+1)-1)/2) ,列号为 j = k - i*(i+1)/2。
- 然后再根据行列坐标计算元素在 b 中的下标:对于对称矩阵中的第 i 行第 j 列的元素,其在压缩存储的一维数组 b 中的下标为 b_index = i*(i+1)/2+j。
因此,元素 aij 在 b 中的下标是 b_index = i*(i+1)/2+j = floor((sqrt(8*k+1)-1)/2)*(floor((sqrt(8*k+1)-1)/2)+1)/2+k-floor((sqrt(8*k+1)-1)/2)*floor((sqrt(8*k+1)-1)/2+1)/2。
相关问题
从标准输入中读入两个多项式。且该多项式中各项的系数均为0或正整数,最高幂次不超过1000000。对于多项式 anxn + an-1xn-1+.... + a1x1 + a0x0 (n<=1000000)的表示方法如下: an n an-1 n-1 ... a1 1 a0 0 第一、二行读入第一个多项式。第一行,表示多项式的项数。紧接着下一行输入该多项式的每一项。相邻两个整数分别表示表达式中一项的系数和指数。在输入中只出现系数不为0的项。 第三、四行读入第二个多项式。将运算结果输出到屏幕。将系数不为0的项按指数从高到低的顺序输出,每次输出其系数和指数,均以一个空格分隔。在行的末尾也输出一个空格符,并且最后要求换行。
输入格式:
第一行,一个整数n,表示第一个多项式的项数。
第二行,2n个整数,表示第一个多项式中的每一项,其中第2i-1个整数表示第i项的系数,第2i个整数表示第i项的指数。
第三行,一个整数m,表示第二个多项式的项数。
第四行,2m个整数,表示第二个多项式中的每一项,其中第2i-1个整数表示第i项的系数,第2i个整数表示第i项的指数。
输出格式:
输出多项式的和,每个非零项按指数从高到低排列。每个非零项的系数和指数之间用一个空格隔开,在每行末尾输出一个空格符,最后一行末尾不能有空格符,并换行。
输入样例:
3
1 2 2 1 3 0
2
-1 2 2 0
输出样例:
1 2 1 0 -1 2
在c89模式下用c语言编写一个程序实现下面的要求 两个一元多项式求和(新) 【问题描述】编写一个程序实现两个一元多项式相加的运算。【输入形式】从标准输入中读入两行以空格分隔的整数,每一行代表一个多项式,且该多项式中各项的系数均为0或正整数,最高幂次不超过50。对于多项式 anxn + an-1xn-1+ ... + a1x1 + a0x0 (n<50)的表示方法如下: an n an-1 n-1 ...a1 1 a0 0 即相邻两个整数分别表示表达式中一项的系数和指数。在输入中只出现系数不为0的项。注意:输入时候首先要输入多项式的系数个数以及指数个数的和,然后在下一行按照"系数 指数"的顺序输入系数和指数
以下是使用C语言编写的程序,可以实现两个一元多项式的相加运算:
```c
#include <stdio.h>
#define MAX_DEGREE 50
int main()
{
int a[MAX_DEGREE+1] = {0}, b[MAX_DEGREE+1] = {0}, c[MAX_DEGREE+1] = {0};
int m, n, i;
scanf("%d %d", &m, &n);
for (i = 0; i < m; i++) {
int coefficient, index;
scanf("%d %d", &coefficient, &index);
a[index] = coefficient;
}
for (i = 0; i < n; i++) {
int coefficient, index;
scanf("%d %d", &coefficient, &index);
b[index] = coefficient;
}
for (i = 0; i <= MAX_DEGREE; i++) {
c[i] = a[i] + b[i];
}
for (i = MAX_DEGREE; i >= 0; i--) {
if (c[i] != 0) {
printf("%d %d ", c[i], i);
}
}
printf("\n");
return 0;
}
```
程序中,我们首先定义三个数组,分别代表两个输入的多项式和它们的和。然后,我们输入多项式的系数个数以及指数个数的和,并按照"系数 指数"的顺序输入系数和指数,将它们存储到相应的数组中。
接着,我们对两个多项式进行相加操作,将结果存储到数组c中。最后,我们从高到低遍历数组c,并输出系数和指数,以表示相加后的多项式。
需要注意的是,在本程序中,我们将多项式的最高幂次设为50,因此数组的大小为MAX_DEGREE+1=51。如果需要计算更高次数的多项式,需要相应地调整数组的大小。
阅读全文