Advertisement

北航机试C语言矩阵问题

阅读量:

矩阵问题

1. 给一个二维数组A赋值如下数据:

0 1 1 1 1
-1 0 1 1 1
-1 -1 0 1 1
-1 -1 -1 0 1
-1 -1 -1 -1 0









2. 输出以下5×5的矩阵

1 1 1 1 1
2 1 1 1 1
3 2 1 1 1
4 3 2 1 1
5 4 3 2 1










3. 拐角矩阵

1 1 1
1 2 2
1 2 3
  1. 左上拐角

#include<stdio.h>

void main()

{ int i,j,k,n;

printf("n : ");

scanf("%d",&n);

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{ k=i>j?j:i;

printf("%4d",k);

}

printf("\n");

}

}

3 2 1
2 2 1
1 1 1
  1. 右下拐角

#include<stdio.h>

void main()

{ int i,j,k,n;

printf("n : ");

scanf("%d",&n);

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{ if(i<=j)

printf("%4d",n+1-j);

else

printf("%4d",n+1-i);

}

printf("\n");

}

}

  1. 左下拐角
1 2 3
1 2 2
1 1 1

#include<stdio.h>

void main()

{ int i,j,k,n;

printf("n : ");

scanf("%d",&n);

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{ if(i+j<=n+1)

printf("%4d",j);

else

printf("%4d",n+1-i);

}

printf("\n");

}

}

1 1 1
2 2 1
3 2 1
  1. 右上拐角

#include<stdio.h>

void main()

{ int i,j,k,n;

printf("n : ");

scanf("%d",&n);

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{ if(i+j<=n+1)

printf("%4d",i);

else

printf("%4d",n+1-j);

}

printf("\n");

}

}

1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

4. 回形矩阵






方法1:四个拐角矩阵拼合而成。

方法1改进:减少判断条件。

#include<stdio.h>

main()

{ int i,j,k,n,mi,ma;

printf("n : ");

scanf("%d",&n);

for(i=1;i<=n;i++)

{ mi=i<=n+1-i?i:n+1-i;

ma=n+1-mi;

for(j=1;j<=n;j++)

{ k=j<mi?j:ma<j?n+1-j:mi;

printf("%3d",k);

}

putchar('\n');

}

}

方法2:利用对称性。

#include<stdio.h>

#define N 20

void main()

{

int a[N][N]={0},i,j,Q,n;

printf("n=");

scanf("%d",&n);

Q=n/2+1;

for(i=1;i<=Q;i++)

for(j=1;j<=Q;j++)

{if(i<=j)

a[i][j]=i;

else

a[i][j]=j;

a[i][n+1-j]=a[i][j];

a[n+1-i][j]=a[i][j];

a[n+1-i][n+1-j]=a[i][j];

}

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

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

printf("\n");

}

}

方法3:按圈打。

#include <stdio.h>

int min(int a,int b,int c,int d)

{

int m=a;

if(m >b) m=b;

if(m >c) m=c;

if(m >d) m=d;

return m;

}

main()

{ int i,j,k,n,mi,ma;

printf("n : ");

scanf("%d", &n);

for(i=1;i <=n;i++)

{ for(j=1;j <=n;j++)

{ k=min(i,j,n+1-i,n+1-j);

printf("%4d",k);

}

putchar('\n');

}

}

5. 螺旋矩阵

1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6 7 8 9





拟人法:按圈行走

#include<stdio.h>

#define N 20

void main()

{

int a[N][N]={0};

int n,s,i,j,edge;

printf("n=");

scanf("%d",&n);

edge=n,s=1;

i=j=1;

do{

while(a[i][j]==0 && i<=edge)

{a[i][j]=s;

s++;i++;}

i--;j++;

while(a[i][j]==0 && j<=edge)

{a[i][j]=s;

s++;j++;}

j--;i--;

while(a[i][j]==0 && i>=n+1-edge)

{a[i][j]=s;

s++;i--;}

i++;j--;

while(a[i][j]==0 && j>=n+1-edge)

{a[i][j]=s;

s++;j--;}

j++;i++;

}while(s<=n*n);

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

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

printf("\n");

}

}

解析法:按区域填空

#include<stdio.h>

main()

{ int n,i,j,k,s,d,l;

int a[20][20]={0};

printf("n : ");scanf("%d",&n);

i=j=1;

for(k=1;k<=n*n;k++)

{ a[i][j]=k;

if(i+j<n+1 && i>=j-1) i++;

else if (i>j && i+j>=n+1) j++;

else if (i+j>n+1 && i<=j) i--;

else if(i+j<=n+1 &&i<j-1) j--;

}

for(i=1;i<=n;i++)

{ for(j=1;j<=n;j++)

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

printf("\n");

}

}

解析法:按圈、段,位置填空

#include<stdio.h>

#define N 20

void main()

{ static int a[N][N];

int i,j,D,Q,G,n,k,m,s;

printf("n=");

scanf("%d",&n);

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

{

if(i>=j && i+j<n+1)

{D=1;Q=j;G=i-(Q-1);}

else if(i+j>=n+1 && i>j)

{D=2;Q=n+1-i;G=j-(Q-1);}

else if(i<=j && i+j>n+1)

{D=3;Q=n+1-j;G=n+1-i-(Q-1);}

else

{D=4;Q=i;G=n+1-j-(Q-1);}

s=0;m=n-1;

for(k=1;k<=Q-1;k++)

s+=4*(m-2*(k-1));

a[i][j]=s+(D-1)(m-2(Q-1))+G;

}

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

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

printf("\n");

}

}

6. 斜行矩阵

1 2 4 7 11
3 5 8 12 16
6 9 13 17 20
10 14 18 21 23
15 19 22 24 25






#include<stdio.h>

#define N 20

void main()

{ static int a[N][N];

int i=1,j=1,n,k=1;

printf("n=");

scanf("%d",&n);

a[1][1]=k;

while(k++<=25)

if(i==n)

{i=j+1;j=n;a[i][j]=k;}

else if(j==1)

{j=i+1;i=1;a[i][j]=k;}

else

{i++;j--;a[i][j]=k;}

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

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

printf("\n");

}

}


7. 蛇形矩阵

1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25







#include<stdio.h>

#define N 20

void main()

{

static int a[N][N];

int i,j,n,d,k;

printf("n=");

scanf("%d",&n);

i=j=1;d=1;

for(k=1;k<=n*n;k++)

{

a[i][j]=k;

i-=d;j+=d;

if(i==n+1) {i=n;j+=2;d=-d;}

else if(j==n+1) {i+=2;j=n;d=-d;}

else if(i==0) {i=1;d=-d;}

else if(j==0) {j=1;d=-d;}

}

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

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

printf("\n");

}

}

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

8. 杨辉三角阵






使用二维数组

include<stdio.h>

#define N 20

void main()

{

static int a[N][N];

int i,j,n;

printf("n=");

scanf("%d",&n);

a[0][0]=1;

for(i=1;i<=n;i++)

for(j=1;j<=i;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=1;i<=n;i++)

{for(j=1;j<=i;j++)

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

printf("\n");

}

}

使用一维数组

#include<stdio.h>

#define N 20

void main()

{

static int a[N];

int i,j,n;

printf("n=");

scanf("%d",&n);

a[1]=1;

for(i=1;i<=n;i++)

{for(j=i;j>=1;j--)

a[j]=a[j]+a[j-1];

for(j=1;j<=i;j++)

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

printf("\n");

}

}

9. 直角三角阵

1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
  1. 形式1

拟人法:

#include<stdio.h>

#define N 20

void main()

{

static int a[N][N];

int i=1,j=1,n,k=1;

printf("n=");

scanf("%d",&n);

a[1][1]=1;

while(k++<=n*(n+1)/2)

if(i==1)

{i=j+1;j=1;a[i][j]=k;}

else

{i--;j++;a[i][j]=k;}

for(i=1;i<=n;i++)

{for(j=1;i+j<=n+1;j++)

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

printf("\n");

}

}

解析法:

#include<stdio.h>

#define N 20

void main()

{

static int a[N][N];

int i,j,n;

printf("n=");

scanf("%d",&n);

for(i=1;i<=n;i++)

for(j=1;j<=n+1-i;j++)

if(i==1 && j==1)

a[i][j]=1;

else if(j==1)

a[i][j]=a[i-1][1]+i-1;

else

a[i][j]=a[i][j-1]+j+(i-1);

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

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

printf("\n");

}

}

解析法:按层打印

#include<stdio.h>

#define N 20

void main()

{

static int a[N][N];

int i,j,n,L;

printf("n=");

scanf("%d",&n);

for(i=1;i<=n;i++)

for(j=1;j<=n+1-i;j++)

{L=i+j-1;

a[i][j]=L*(L-1)/2+1+j-1;

}

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

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

printf("\n");

}

}

  1. 形式2
1 6 10 13 15
2 7 11 14
3 8 12
4 9
5

#include<stdio.h>

#define N 20

void main()

{

static int a[N][N];

int i=1,j=1,n,k=1;

printf("n=");

scanf("%d",&n);

a[1][1]=1;

while(k++<=n*(n+1)/2)

if(i+j==n+1)

{j=n+1-i+1;i=1;a[i][j]=k;}

else

{i++;a[i][j]=k;}

for(i=1;i<=n;i++)

{for(j=1;i+j<=n+1;j++)

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

printf("\n");

}

}

  1. 形式3
1
2 6
3 7 10
4 8 11 13
5 9 12 14 15

#include<stdio.h>

#define N 20

void main()

{

static int a[N][N];

int i=1,j=1,n,k=1;

printf("n=");

scanf("%d",&n);

a[1][1]=1;

while(k++<=n*(n+1)/2)

if(i==n)

{i=j+1;j++;a[i][j]=k;}

else

{i++;a[i][j]=k;}

for(i=1;i<=n;i++)

{for(j=1;j<=i;j++)

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

printf("\n");

}

}

1
6 2
10 7 3
13 11 8 4
15 14 12 9 5
  1. 形式4

#include<stdio.h>

#define N 20

void main()

{

static int a[N][N];

int i=1,j=1,n,k=1;

printf("n=");

scanf("%d",&n);

a[1][1]=1;

while(k++<=n*(n+1)/2)

if(i==n)

{i=n+1-j+1;j=1;a[i][j]=k;}

else

{i++;j++;a[i][j]=k;}

for(i=1;i<=n;i++)

{for(j=1;j<=i;j++)

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

printf("\n");

}

}

1. 打印星号图。

  1. 共打印3行,每列6个。
* * * * * *
* * * * * *
* * * * * *
  1. 平行四边形
* * * *
* * * *
* * * *
* * * *
  1. 等腰三角形
*
* * *
* * * * *
* * * * * * *
  1. 菱形
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*

方法2:共7行,上4行:每i行先打印4-i个空格,再打印2i-1个‘*’号。

下3行:行数递减时,每i行先打印4-i个空格,再打印2i-1个‘*’号。

对m行,n=m/2+1,先打印1n行,再打印n-11行。

include<stdio.h>

void main()

{

int i,j,n,m;

printf("input m");

scanf("%d",&m);

n=m/2+1;

for(i=1;i<=n;i++)

{

for(j=1;j<=n-i;j++)

putchar(' ');

for(j=1;j<=2*i-1;j++)

putchar('*');

printf("\n");

}

for(i=n-1;i>0;i--)

{

for(j=1;j<=n-i;j++)

putchar(' ');

for(j=1;j<=2*i-1;j++)

putchar('*');

printf("\n");

}

}

方法3:统一处理

#include<stdio.h>

#include<math.h>

void main()

{

int i,j;

for (i=1;i<=7;i++)

{ for (j=1;j<=abs(i-4);j++) printf(" ");

for (j=1;j<=7-2abs(i-4);j++) printf("");

printf("\n");

}

}

  1. 两个等腰三角形
* *
* * * * * *
* * * * * * * * * *
* * * * * * * * * * * * * *
  1. 两个平行四边形
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *

2. 打印字母等腰三角形

  1. 三角形的大小由键盘输入,如n=5,如图
A
A B C
A B C D E
A B C D E F G
A B C D E F G H I
  1. 打印字母对称的等腰三角形,三角形大小由键盘输入。如图
A
B A B
C B A B C
D C B A B C D
E D C B A B C D E

全部评论 (0)

还没有任何评论哟~