1550 - A+B for Matrices

This time, you are supposed to find A+B where A and B are two matrices, and then count the number of zero rows and columns.

题目输入

    The input consists of several test cases, each starts with a pair of positive integers M and N (≤10) which are the number of rows and columns of the matrices, respectively. Then 2*M lines follow, each contains N integers in [-100, 100], separated by a space. The first M lines correspond to the elements of A and the second M lines to that of B.

<span style="font-size:12.0pt;font-family:&quot;color:#333333;background:white;">&nbsp;&nbsp;&nbsp; The input is terminated by a zero M and that case must NOT be processed.</span> 

<br />

题目输出

    For each test case you should output in one line the total number of zero rows and columns of A+B.

输入/输出样例

题目输入

2 2
1 1
1 1
-1 -1
10 9
2 3
1 2 3
4 5 6
-1 -2 -3
-4 -5 -6
0

题目输出

1
5

提示

本题需要解决的问题是求出两个矩阵相加后的结果矩阵中一共有多少零行和零列。所谓零行在线性代数中的就是一行中所有元素为0的行,同样零列也就是一列中所有元素为0的列。那么,解决本题就进行一次矩阵相加即可。用两个数组存储两个矩阵,再用一个数组存储这两个矩阵相加后的结果。然后对结果进行两次遍历,分别求出零行的数目和零列的数目。

注意这里有多组测试数据,那么怎样停止程序呢?每次读入第一个整数,判断是否为0,如果为0则说明输入结束了。

步骤如下:

1)读入数据(两个矩阵);

2)对读入的两个矩阵求和,结果存储在另一个矩阵(结果矩阵)中;

3)对结果矩阵进行两次遍历,获得零行和零列的总数。


C语言解答

#include <stdio.h>
int main()
{
  while(1)
  {
    int m,n;
    scanf("%d",&m);
    if(m==0)
    {
      break;
    }
    scanf("%d",&n);
    int A[20][20];
    int B[20][20];
    for(int i=0;i<m;i++)
    {
      for(int j=0;j<n;j++)
      {
        scanf("%d",&A[i][j]);
      }
    }
    for(int i=0;i<m;i++)
    {
      for(int j=0;j<n;j++)
      {
        scanf("%d",&B[i][j]);
      }
    }
    int count=0;
    int flag=0;
    for(int i=0;i<m;i++)
    {
      flag=0;
      for(int j=0;j<n;j++)
      {
        if(A[i][j]+B[i][j]!=0)
        {
          flag=1;
          break;
        }
      }
      if(flag==0)
      {
        count++;
      }
    }
    for(int i=0;i<n;i++)
    {
      flag=0;
      for(int j=0;j<m;j++)
      {
        if(A[j][i]+B[j][i]!=0)
        {
          flag=1;
          break;
        }
      }
      if(flag==0)
      {
        count++;
      }
    }
    printf("%d\n",count);
    
  }
}

C++解答

#include <stdio.h>

// 定义三个矩阵,分别存储将要输入的两个矩阵以及两个矩阵的和
int a[11][11];
int b[11][11];
int c[11][11];

/*
 * 将矩阵 a 和矩阵 b 相加
 * 传入的是矩阵的行数 m 以及列数 n
 * 将矩阵 a 和矩阵 b 的结果存储在矩阵 c 中
 */
void addM(int m,int n){
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            c[i][j] = a[i][j] + b[i][j];
        }
    }
}

/*
 * 获得答案:遍历查看有多少零行和零列
 */
int getAns(int m, int n){
    int ans = 0;
    for(int i=0;i<m;i++){	// 先遍历零行
        int j=0;
        for(j=0;j<n;j++){	// 每行中从第一列开始
            if(c[i][j]){
                break;
            }
        }
        if(j == n){			// 如果整行遍历完了没有发现非零值,则这一行是零行
            ans ++;			// 这样的话结果增加 1
        }
    }

    for(int i=0;i<n;i++){	// 然后遍历列,方法与遍历行是一样的
        int j=0;
        for(j=0;j<m;j++){
            if((c[j][i])){
                break;
            }
        }
        if(j == m){
            ans ++;
        }
    }

    return ans;		// 返回遍历的结果
}

int main(){

    int m, n;
    while(scanf("%d", &m), m){		// 读入行数,如果某次行数为0,则说明输入结束了
        scanf("%d", &n);
        for(int i=0;i<m;i++){		// 读入第一个矩阵的数据
            for(int j=0;j<n;j++){
                scanf("%d",&a[i][j]);
            }
        }
        for(int i=0;i<m;i++){		// 读入第二个矩阵的数据
            for(int j=0;j<n;j++){
                scanf("%d",&b[i][j]);
            }
        }
        addM(m,n);					// 求两个矩阵的和
        printf("%d\n",getAns(m,n));	// 输出结果
    }

    return 0;
}

提示

本题需要解决的问题是求出两个矩阵相加后的结果矩阵中一共有多少零行和零列。所谓零行在线性代数中的就是一行中所有元素为0的行,同样零列也就是一列中所有元素为0的列。那么,解决本题就进行一次矩阵相加即可。用两个数组存储两个矩阵,再用一个数组存储这两个矩阵相加后的结果。然后对结果进行两次遍历,分别求出零行的数目和零列的数目。

注意这里有多组测试数据,那么怎样停止程序呢?每次读入第一个整数,判断是否为0,如果为0则说明输入结束了。

步骤如下:

1)读入数据(两个矩阵);

2)对读入的两个矩阵求和,结果存储在另一个矩阵(结果矩阵)中;

3)对结果矩阵进行两次遍历,获得零行和零列的总数。


时间限制 1 秒
内存限制 32 MB
讨论 统计
上一题 下一题