1.
编写一个算法,计算n阶方阵A的两个对角线元素的和。A采用数组表示。
#include <stdio.h>
#define N 4
int main(){
int A[N][N];
int i,j,m;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
scanf("%d",&m);
A[i][j]=m;
}
}/*
for(i=0;i<N;i++){
for(j=0;j<N;j++){
printf("%4d",A[i][j]);
}
printf("%d\n");
}*/
//计算主对角线的和
int sum1=0,sum2=0;
for(i=0;i<N;i++){
sum1+=A[i][i];
}
//计算副对角线的和
for(i=0;i<N;i++){
sum2+=A[i][N-i-1];
}
printf("The sum of the main diagonals is %d\nthe sum of the secondary diagonals is %d",sum1,sum2);
}
return 0;
2.
编写一个算法,实现两个采用三元组表示的n阶稀疏矩阵的加法运算。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define M 5
#define N 6
struct part{
int row;
int col;
int value;
};
int main(){
int A[M][N] ={0};
int B[M][N] ={0};
int C[M][N];
srand(time(NULL));
int n =1 + rand()%(M*N/3); //大致保证非零数在1到10之间
struct part data1[n],data2[n],data3[2*n];
printf("n = %d\n",n);
int i,j;
for(i=0;i<n;i++){
A[rand()%M][rand()%N] = 1+rand()%10;
B[rand()%M][rand()%N] = 1+rand()%10;
}
int a=0,b=0,c=0,k=0;
for(i=0;i<M;i++){
for(j=0;j<N;j++){
if(A[i][j]!=0){
data1[a].row = i;
data1[a].col = j;
data1[a].value = A[i][j];
a++;
}
printf("%4d",A[i][j]);
}
printf("\n");
}
for(i=0;i<n;i++){
printf("(%d %d %d)\n",data1[i].row,data1[i].col,data1[i].value);
}
printf("\n");
for(i=0;i<M;i++){
for(j=0;j<N;j++){
if(B[i][j]!=0){
data2[b].row = i;
data2[b].col = j;
data2[b].value = B[i][j];
b++;
}
printf("%4d",B[i][j]);
}
printf("\n");
}
for(i=0;i<n;i++){
printf("(%d %d %d)\n",data2[i].row,data2[i].col,data2[i].value);
}
for(i=0;i<M;i++){
for(j=0;j<N;j++){
C[i][j] = A[i][j]+B[i][j];
if((A[i][j]!=0)&&(B[i][j]!=0)){
k++;
}
}
}
for(i=0;i<M;i++){
for(j=0;j<N;j++){
if(C[i][j]!=0){
data3[c].row = i;
data3[c].col = j;
data3[c].value = C[i][j];
c++;
}
printf("%4d",C[i][j]);
}
printf("\n");
}
printf("k = %d\n",k);
for(i=0;i<2*n-k;i++){
printf("(%d %d %d)\n",data3[i].row,data3[i].col,data3[i].value);
}
return 0;
}
n = 6
0 0 0 0 0 0
0 0 0 4 0 0
0 0 0 0 0 0
0 0 0 0 3 10
0 4 0 10 6 0
(1 3 4)
(3 4 3)
(3 5 10)
(4 1 4)
(4 3 10)
(4 4 6)
3 0 0 0 9 0
0 0 7 0 0 0
0 4 0 0 0 0
10 0 0 0 0 0
0 0 0 0 0 4
(0 0 3)
(0 4 9)
(1 2 7)
(2 1 4)
(3 0 10)
(4 5 4)
3 0 0 0 9 0
0 0 7 4 0 0
0 4 0 0 0 0
10 0 0 0 3 10
0 4 0 10 6 4
k = 0
(0 0 3)
(0 4 9)
(1 2 7)
(1 3 4)
(2 1 4)
(3 0 10)
(3 4 3)
(3 5 10)
(4 1 4)
(4 3 10)
(4 4 6)
(4 5 4)
3.
编写一个算法,寻找m×n的矩阵中的每一行的最大值元素,并用三元组存储该最大值元素及其位置。
#include <stdio.h>
#define M 3
#define N 4
struct {
int row;
int col;
int value;
} data[M];
int main(){
int A[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};
int i,j;
for(i=0;i<M;i++){
for(j=0;j<N;j++){
printf("%4d",A[i][j]);
}
printf("\n");
}
for(i=0;i<M;i++){
data[i].row = i;
data[i].col = 0;
data[i].value = A[i][0];
}
for(i=0;i<M;i++){
for(j=0;j<N;j++){
if(A[i][j]>A[i][0]){
data[i].row = i;
data[i].col = j;
data[i].value = A[i][j];
}
}
}
for(i=0;i<M;i++){
printf("(%d %d %d)\n",data[i].row,data[i].col,data[i].value);
}
return 0;
}
4.
编写一个算法,实现4阶杨辉魔方(阴图)。
#include <stdio.h>
#define N 4
void swap(int *p,int *q);
int main(){
int *p,*q;
int A[N][N] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int i,j;
//初始矩阵
for(i=0;i<N;i++){
for(j=0;j<N;j++){
printf("%4d",A[i][j]);
}
printf("\n");
}
for(i=0;i<N/2;i++){
for(j=0;j<N;j++){
if((i==j)||(i+j==3)){
p = &A[i][j],q = &A[3-i][3-j];
swap(p,q);
}
}
}
//最终矩阵,用于验证
for(i=0;i<N;i++){
printf("\n");
for(j=0;j<N;j++){
printf("%4d",A[i][j]);
}
}
return 0;
}
void swap(int *p,int *q){
int t;
t = *p;
*p = *q;
*q = t;
}