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

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;

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值