常见算法:c语言矩阵算法问题

时间:2021-06-17 02:03:51

矩阵:数学上,一个m×n矩阵乃一mn列的矩形阵列。矩阵由数组成,或更一般的,由某环中元素组成。

0.矩阵N*N相乘

#include<stdio.h>
int main(void)
{
        int i,j,k;
        double a[3][3],b[3][3],c[3][3];

        for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                        printf("Enter the number in a[%d][%d]\n",i,j);
                        scanf("%lf",&a[i][j]);
                }
        }

        for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                        printf("Enter the number in b[%d][%d]\n",i,j);
                        scanf("%lf",&b[i][j]);
                }
        }

        for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                        c[i][j]=0;
                        for(k=0;k<3;k++){
                                c[i][j]=a[i][k]*b[k][j]+c[i][j];
                        }
                }
        }

        for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                        printf("    %lf",c[i][j]);
                }
                printf("\n");
        }

        return 0;
}


1,求矩阵转置问题

/*
根据主函数,编写一下两个函数
1:求数组a[4][4]主对角线上元素的和 ----区分主对角线和次对角线的区别
2:实现对数组a[4][4]的矩阵转置处理
*/
#include<stdio.h>
void convert(int *p)     //数组转置
{
	int i,j,t;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			t=*(p+4*i+j);
			*(p+4*i+j)=*(p+4*j+i);
			*(p+4*j+i)=t;
		}
}

int total(int a[][4],int n)       //主对角线上元素的和
{
	int i,sum=0;
	for(i=0;i<4;++i)
		if(a[i][i]!=0)
			sum+=a[i][i];
	return sum;
}
int total1(int a[][4],int n)     //次对角线上元素之和
{
	int i,j,sum=0;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			if((i+j)==3) sum+=a[i][j];     //此时仅当i+j=n-1的时候才是次对角线上的点
		}
		return sum;
}

void main()
{
	static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
	int *p,i,sum,sum1;
	sum=total(a,4);
	sum1=total1(a,4);
	printf("主对角线之和:%d\n",sum);
	printf("次对角线之和:%d\n",sum1);
	p=*a;
	convert(p);
	printf("转置后的数组是:\n");
	for(i=0;i<4;++i)
		printf("%d %d %d %d \n",a[i][0],a[i][1],a[i][2],a[i][3]);

}

2,求矩阵中最大值的问题

/*
有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及所在的行号和列号
*/
#include<stdio.h>
void main()
{
	int a[3][4],i,j;
	int colum,row;
	printf("please input the array:\n");
	for(i=0;i<3;i++)
		for(j=0;j<4;j++)
			scanf("%d",a[i][j]);
	printf("\n");
	int max=a[0][0];    //设定最大值是第一个数
	for(i=0;i<3;i++)
		for(j=0;j<4;j++)
			if(a[i][j]>max)
			{
				max=a[i][j];
				colum=j;
				row=i;
			}
	printf("max=%d,colum=%d,row=%d",max,colum,row);


}

3,找出m*n矩阵的鞍点

#include<stdio.h>
#include<stdlib.h>
#define M 3
#define N 4
void main()
{
	int a[M][N],i,j,k;
	int max,t;
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
			scanf("%d",&a[i][j]);
	for(i=0;i<M;i++)
	{
		max=0;                        //此时假设每一行的最大值是第一个数即a[i][0]
		for(j=i+1;j<N;j++)            //找出列中的最大值
		{
			if(a[i][j]>a[i][max])
				max=j;
		}
		for(t=1,k=0;k<M&&t;k++)      //判断是否在列中是不是最小值
		{
			if(a[k][max]<a[i][max])  //如果还存在数比a[k][max]的值还小,则置t=0,
				t=0;                 //t是一个标识,t=0  表示不存在,
		}
	}
	if(t) printf("yes,%d\n",a[i][max]);
	else  printf("no");
}
4,矩阵的周边之和问题

/*
编写函数实现计算任意N*4整型矩阵上的周边元素之和
假设输入的数值
1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16
*/
#include<stdio.h>
#define N 3
int fun(int a[][4],int n)
{
	int i,sum=0;
	for(i=0;i<4;i++)
		sum+=a[0][i]+a[n-1][i];   //第一行和最后一行的和,此时的i代表的是列数
	for(i=1;i<n-1;i++)
		sum+=a[i][0]+a[i][3];       //第一列的的第二行开始到 n-1行的     和最后一列的的第二行开始到 n-1行的,此时的i代表的是行数
	return sum;
}
void main()
{
	int i,j;
	int a[N][4];
	for(i=0;i<N;i++)
		for(j=0;j<4;j++)
			scanf("%d",&a[i][j]);
	int s=fun(a,N);
	printf("矩阵N*4周边的元素之和为:%d",s);
	printf("\n");
}

5.判断一个N*N的矩阵是否为对称矩阵,将原矩阵输出,判断结果输出

#include<stdio.h>   
#define N 10
void main()  
{  
    int a[N][N],i,j,k,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)  
       for(j=0;j<n;j++)
          scanf("%d",&a[i][j]);
    for(i=0;i<n;i++)  
    {
         for(j=i+1;j<n;j++)
          {
             if(a[i][j]==a[j][i])    k=1;
             else   k=0;
          }
   }
   if(k=0)    printf("bushi");
   else       printf("shi\n");
   for(i=0;i<n;i++)  
      for(j=0;j<n;j++)
         printf("%d",a[i][j]);
}
6,求一个4*3的矩阵各行元素的最大值,将原矩阵和求出的最大值全部输出

#include<stdio.h>
void main()  
{  
    int a[4][3],s[4],i,j,k;  
    for(i=0;i<4;i++)  
         for(j=0;j<3;j++)
            scanf("%d",*(a+i)+j);  
  
    for(i=0;i<4;i++)  
     { 
       *(s+i)= *(*(a+i));  
         for(j=1;j<3;j++)  
           if(*(s+i) < *(*(a+i)+j))  
              *(s+i)= *(*(a+i)+j);  
      }  
  
    for(i=0;i<4;i++)  
     {
        printf("Row=%d Max=%d",i,s[i] );  
        printf("\n");  
     }  
}

7,求一个3*5的矩阵各列元素的最大值,将原矩阵和求出的最大值全部输出

#include<stdio.h>
void main()  
{  
 int a[3][5],s[3],i,j,k;  
 for(i=0;i<3;i++)  
 for(j=0;j<5;j++)
  scanf("%d",*(a+i)+j);  
  
 for(i=0;i<3;i++)  
 { *(s+i)= *(*(a+j));  
 for(j=1;j<5;j++)  
 if(*(s+i) < *(*(a+i)+j))  
 *(s+i)= *(*(a+i)+j);  
 }  
  
 for(i=0;i<3;i++)  
 {
  printf("Line=%d Max=%d",j,s[j] );  
 printf("\n");  
 }  

8,求一个3*4的矩阵各列元素的平均值;将原矩阵和求出的平均值全部输出

#include<stdio.h>
void main()  
{  
 int a[4][3],s[4],i,j,k;  
 for(i=0;i<4;i++)  
  for(j=0;j<3;j++)
   scanf("%d",*(a+i)+j);
  
  for(i=0;i<4;i++)
  {
   k=0;
   for(j=0;j<3;j++)
    k+=a[i][j];
   printf("第%d行的平均值是%d",i+1,k);
   printf("\n");
  }
}

9,求一个4*3的矩阵各行元素的平均值;将原矩阵和求出的平均值全部输出

#include<stdio.h>
void main()  
{  
 int a[4][3],s[4],i,j,k;  
 for(i=0;i<4;i++)  
  for(j=0;j<3;j++)
   scanf("%d",*(a+i)+j);
  
  for(i=0;i<4;i++)
  {
   k=0;
   for(j=0;j<3;j++)
    k+=a[i][j];
   printf("第%d行的平均值是%d",i+1,k);
   printf("\n");
  }
}