问题描述
将稀疏矩阵A的非零元以行序为主序的顺序存于一维数组V中,并用二维数组B表示A中的相应元素是否为零元素,例如:

可用
和
表示。
编程实现上述表示法的矩阵加法运算。
输入格式
首先输入两个整数n和m,为矩阵维数,然后输入两个矩阵的值B1、V1和B2、V2。
输出格式
输出矩阵运算结果B、V。
样例输入
3 4
1 0 0 1
0 1 0 0
1 0 0 0
15 22 -6 9
0 1 1 0
0 1 1 0
1 0 0 1
3 2 6 2 -5 8
样例输出
1 1 1 1
0 0 1 0
1 0 0 1
15 3 2 22 2 4 8
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define MAXLENGTH 10000
int main(){
int i,j;
int n,m;
int p=0, q=0, r=0; //做加法的下标
int count1 = 0; //记录非零元个数
int count2 = 0;
int tmp;
int B1[MAXSIZE][MAXSIZE];
int B2[MAXSIZE][MAXSIZE];
int B[MAXSIZE][MAXSIZE] = {0};
int V1[MAXLENGTH];
int V2[MAXLENGTH];
int V[MAXLENGTH] = {0};
scanf("%d %d", &n, &m);
//输入矩阵
for(i=0; i<n; i++){
for(j=0; j<m; j++){
scanf("%d", &tmp);
if(tmp == 1)
count1 ++;
B1[i][j] = tmp;
}
}
for(i=0; i<count1; i++){
scanf("%d", &V1[i]);
}
for(i=0; i<n; i++){
for(j=0; j<m; j++){
scanf("%d", &tmp);
if(tmp == 1)
count2 ++;
B2[i][j] = tmp;
}
}
for(i=0; i<count2; i++){
scanf("%d", &V2[i]);
}
//做加法
for(i=0; i<n; i++){
for(j=0; j<m; j++){
if(B1[i][j] == 1 && B2[i][j] == 0){
B[i][j] = 1;
V[p] = V1[q];
p++;
q++;
}else if(B1[i][j] == 0 && B2[i][j] == 1){
B[i][j] = 1;
V[p] = V2[r];
p++;
r++;
}else if(B1[i][j] == 1 && B2[i][j] == 1){
tmp = V1[q] + V2[r];
q++; r++;
if(tmp != 0){
B[i][j] = 1;
V[p] = tmp;
p++;
}
}
}
}
//输出
for(i=0; i<n; i++){
for(j=0; j<m; j++){
printf("%d ", B[i][j]);
}
printf("\n");
}
i=0;
while(1){
if(V[i] == 0)
break;
printf("%d ", V[i]);
i++;
}
return 0;
}
版权声明:本文为m0_46951573原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。