c语言矩阵问题,【概率数组面试题】面试问题:C语言矩阵对比… - 看准网

C语言矩阵对比,动态二维数组定义,随机数生成

大一的时候,我们的高代老师教矩阵时让我们去写个程序生成1000000个矩阵判断矩阵A与矩阵B,在AB=BA概率下相等情况有多少,(当然,只是为了他下节课教学打个底子)我在尝试后给出了一个答案

我的想法时是先随机生成两个矩阵,对比后给出如果相同,则返回1,在主函数相加,得最后成立的有多少个

#include

#include

#include

//只讨论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

a[i]=(int*)malloc(number*sizeof(int));//动态申请二维数组来构建矩阵

for(i=0;i

for(j=0;j

juzhenA[i][j]=rand()%2;//给矩阵A赋值

for(i=0;i

for(j=0;j

juzhenB[i][j]=rand()%2;//给矩阵B赋值

printf("AB = \n");

for(i=0;i

{

for(j=0;j

{

juzhenAB[i][j]=0;

for(k=0;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

{

for(j=0;j

{

juzhenBA[i][j]=0;

for(k=0;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

for(j=0;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

#include

#include

#include

#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

{

for(j=0;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

{

for(j=0;j

{

printf("%6d",a[i][j]);

}

printf("\n");

}

return;

}

void Matrix_Generate(int a[m][m])

{

int i,j;

for(i=0;i

{

for(j=0;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

{

for(j=0;j

{

c[i][j] = 0;

for(k=0;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

{

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;

老师放弃了动态二位数组的定义,但保留了随机数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值