常見演算法:c語言矩陣演算法問題
阿新 • • 發佈:2019-01-06
矩陣:數學上,一個m×n矩陣乃一m行n列的矩形陣列。矩陣由陣列成,或更一般的,由某環中元素組成。
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");
}
}