j?j:i;printf("%4d",k);}printf("\n");}}0111-1011-1-1011-1-1-101-1-1111" />
当前位置:文档之家› 矩阵问题(c语言)讲解

矩阵问题(c语言)讲解

矩阵问题(c语言)讲解
矩阵问题(c语言)讲解

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

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

3.拐角矩阵

1)左上拐角

#include

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");

}

}

0 1 1 1

-1 0 1 1

-1 -1 0 1 1

-1 -1 -1 0 1

-1 -1

1 1 1 1

2 1 1 1

3 2 1 1 1

4 3 2 1 1

2 1

1 1

1 2

2) 右下拐角

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"); } }

3) 左下拐角

1 2 3

1 2 2

1 1 #include 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"); } }

3 2 2 2 1

4) 右上拐角

#include 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"); } }

4. 回形矩阵

方法1:四个拐角矩阵拼合而成。 方法1改进:减少判断条件。 #include 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

putchar('\n'); } }

1 1

2 1

3 2 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

方法2:利用对称性。

#include

#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

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 2

3 12

3 18 25 22 11

4 19 20 21 10

5 6 7 8 9 拟人法:按圈行走

#include

#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

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=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

}

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

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

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

printf("\n");

}

}

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

#include

#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

{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 1

7 20

10 14 18 21 23

15 19 22 24 25

#include

#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 1

4 16

4 9 13 17 22

10 12 18 21 23

11 19 20 24 25

#include #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"); } }

8. 杨辉三角阵

使用二维数组 include #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];

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

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

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

使用一维数组

#include #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) 形式1

拟人法:

#include #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

1 3 6

10 15 2 5 9

14 4 8 13

7 12

11

{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

#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

#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");

}

}

2)形式2

1 6 10 13 15

2 7 11 14

3 8 12

4 9

5

#include

#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");

}

}

3)形式3

1

2 6

3 7 10

4 8 11 13

5 9 12 14 15

#include

#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"); } }

4) 形式4

#include #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 6

2 10 7

3 13 11 8

4 1

5 14 12 9

5

1)共打印3行,每列6个。

* * * * * *

* * * * * *

* * * * * *

2)平行四边形

* * * *

* * * *

* * * *

* * * *

3)等腰三角形

*

* * *

* * * * *

* * * * * * *

4)菱形

*

* * *

* * * * *

* * * * * * *

* * * * *

* * *

*

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

下3行:行数递减时,每i行先打印4-i个空格,再打印2i-1个‘*’号。对m行,n=m/2+1,先打印1~n行,再打印n-1~1行。

# include

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

#include

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-2*abs(i-4);j++) printf("*");

printf("\n");

}

}

5)两个等腰三角形

* *

* * * * * *

* * * * * * * * * *

* * * * * * * * * * * * * *

6)两个平行四边形

* * * * * * * *

* * * * * * * *

* * * * * * * *

* * * * * * * *

2.打印字母等腰三角形

1)三角形的大小由键盘输入,如n=5,如图

2)

相关主题
文本预览
相关文档 最新文档