首先,肯定需要两个二维数组a[10][10],b[10][10]
我首先想到要将数组初始化了,后来在扫描结束了给数组其他部分赋初值,还想被赋值的不能是0,╮(╯▽╰)╭全想偏了,因为后面在判断行、列是否全为零的时候并不会取到后面的初值。
接着是怎样判断和中一个行(数组)是否全为零。
1.计算出两矩阵的和矩阵,判断该矩阵中行列全0的数目(2)
何时计算?
1.1扫描获得两个矩阵(二维数组)之后,再扫描一遍A、B矩阵,计算出和矩阵
1.2扫描获取第二个矩阵(二维数组)的同时计算出和矩阵
(1.1到1.2 时间上的优化)
2.不计算和矩阵,用一个s计算A、B矩阵对应位置的和,flag做标兵,一旦s不为零即该行(或列)不是全为零
(1到2 空间上的优化)
上面最终都是一个一个判断行或列中元素是否全部为0.
#include<stdio.h>
int main()
{
int m,n;
int a[10][10];
int b[10][10];
int i=0,j=0,s=0,num=0;
int flag=0;
while(1)
{
scanf("%d",&m);
if(m!=0)
{
scanf("%d",&n);
//先初始化a,b数组
/*
for(i=0;i<10;i++)
for(j=0;j<10;j++)
a[i][j]=-1;
*/
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&b[i][j]);
num=0;
//判断几行为0 相当于判断一个数组是否全为零 貌似有好的方法的
for(i=0;i<m;i++)
{
flag=0;
for(j=0;(j<n)&&(flag==0);j++)
{
s=a[i][j]+b[i][j];
if(s!=0)
flag=1;
}
if(flag==0)
num++;
}
s=0;
//判断几列为0
for(j=0;j<n;j++)
{
flag=0;
for(i=0;(i<m)&&(flag==0);i++)//数组这样取用时会比较多 矩阵转置的做法?
{
s=a[i][j]+b[i][j];
if(s!=0)
flag=1;
}
if(flag==0)
num++;
}
printf("%d\n",num);
}
else
break;
}
return 0;
}
下面是别人的代码,C++写的
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
//[0][0] [0][1]
//http://ac.jobdu.com/problem.php?pid=1001
//a+b matrices
int t_1001()
{
int matr[11][11];
int n=0,m=0;
int i=0,j=0;
int k=0,l=0;
int tmp=0,flag_r;
int ary[11];
while(!feof(stdin))
{
m=0; //行数
n=0; //列数
scanf("%d",&m);
if(m == 0)
break;
scanf("%d",&n);
k=m,l=0;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&matr[i][j]);
}
}
flag_r=0;
for(i=0;i<11;i++)
{
ary[i]=1;
}
for(i=0;i<m;i++)
{
flag_r=0;
for(j=0;j<n;j++)
{
scanf("%d",&tmp);
if((matr[i][j]+=tmp) !=0)
{
flag_r=1;
ary[j]=0;
}
if( i == (m-1) )
{
l+=ary[j];
}
}
k-=flag_r;
}
// printf(" k=%d l=%d %d\n",k,l,k+l);
printf("%d\n",k+l);
}
return 0;
}
int main()
{
//cout << "t_1000!" << endl;
t_1001();
//cout << "t_1000,run end!" << endl;
//cout << "Hello world!" << endl;
return 0;
}
但是想说,这里面其实有很多不太好的地方,比如:
1.判断几列全0的时候,取数组元素就比判断行为0的要慢。
2.其实s[i][j]不等于零,就能同时排除i行和j列了。
3.感觉之前好像有说面试题里,有问怎样快速判断数组是否全0,但是我去网上搜也没搜到呢