C语言矩阵对比,动态二维数组定义,随机数生成
大一的时候,我们的高代老师教矩阵时让我们去写个程序生成1000000个矩阵判断矩阵A与矩阵B,在AB=BA概率下相等情况有多少,(当然,只是为了他下节课教学打个底子)我在尝试后给出了一个答案
我的想法时是先随机生成两个矩阵,对比后给出如果相同,则返回1,在主函数相加,得最后成立的有多少个
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
//只讨论AB和BA都存在且有可能相等的情形,即两个矩阵行列数都相等
int juzhen(int number)
{
int **a;
int juzhenA[10][10],juzhenB[10][10],i,j,k,juzhenAB[10][10],juzhenBA[10][10];
a=(int**)malloc(number*sizeof(int));
for(i=0;i<number;i++)
a[i]=(int*)malloc(number*sizeof(int));//动态申请二维数组来构建矩阵
for(i=0;i<number;i++)
for(j=0;j<number;j++)
juzhenA[i][j]=rand()%2;//给矩阵A赋值
for(i=0;i<number;i++)
for(j=0;j<number;j++)
juzhenB[i][j]=rand()%2;//给矩阵B赋值
printf("AB = \n");
for(i=0;i<number;i++)
{
for(j=0;j<number;j++)
{
juzhenAB[i][j]=0;
for(k=0;k<number;k++)
juzhenAB[i][j]+=juzhenA[i][k]*juzhenB[k][j];//矩阵A和矩阵B相乘得矩阵AB
printf("%3d ",juzhenAB[i][j]);
}
printf("\n");
}
printf("BA=\n");
for(i=0;i<number;i++)
{
for(j=0;j<number;j++)
{
juzhenBA[i][j]=0;
for(k=0;k<number;k++)
juzhenBA[i][j]+=juzhenB[i][k]*juzhenA[k][j];//矩阵B和矩阵A相乘得矩阵BA
printf("%3d ",juzhenBA[i][j]);
}
printf("\n");
}
for(i=0,k=0;i<number;i++)
for(j=0;j<number;j++)
if(juzhenAB[i][j]==juzhenBA[i][j])
k++;
if(k==number*number)
i=1;
else
i=0;
return i;
}
int main()
{
srand((int)time(NULL));
int number,i,c=0,p=0;
printf("请输入要创建矩阵的行数:");
scanf("%d",&number);
printf("请输入要对比矩阵的次数: ");
scanf("%d",&i);
while(c!=i)
{
p+=juzhen(number);
c++;
}//循环调用矩阵函数
printf("矩阵AB=矩阵BA的可能性为%d/%d",p,i);
}
老师写的代码如下
//老师的版本如下
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define m 3
#define Max 5
#define Num 10000000
/* 判断两个矩阵是否相等,如果相等,返回1,如果不相等,返回0 */
int Is_Equal(int a[m][m],int b[m][m])
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
if(a[i][j]!=b[i][j])
return(0);
}
}
return(1);
}
/* 输出矩阵的结果 */
void Matrix_Print(int a[m][m])
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
printf("%6d",a[i][j]);
}
printf("\n");
}
return;
}
void Matrix_Generate(int a[m][m])
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
a[i][j] = rand()%Max;
}
return;
}
void Matrix_Mul(int a[m][m], int b[m][m], int c[m][m])
{
int i,j,k;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
c[i][j] = 0;
for(k=0;k<m;k++)
{
c[i][j] = c[i][j] + a[i][k]*b[k][j];
}
}
}
return;
}
int main()
{
int a[m][m];
int b[m][m];
int c[m][m]={0};
int d[m][m]={0};
int n,total,flag;
total=0;
srand((unsigned)time(NULL));
for (n=0;n<Num;n++)//验证n个数据
{
Matrix_Generate(a);
Matrix_Generate(b);
Matrix_Mul(a,b,c);
Matrix_Mul(b,a,d);
flag = Is_Equal(c,d);
if(flag == 1)
{
total++;
printf("出现相等!\nA = \n");
Matrix_Print(a);
printf("B = \n");
Matrix_Print(b);
printf("AB = \n");
Matrix_Print(c);
printf("BA = \n");
Matrix_Print(d);
}
}
printf("相等的总数为:%d\n",total);
return;
老师放弃了动态二位数组的定义,但保留了随机数。