矩阵问题(c语言)讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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;}
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"); }
} 8. 杨辉三角阵
1 11 121 1331 14641
使用二维数组 include<stdio.h> #define N 20 void main() {
4. 回形矩阵
11111 12221 12321 12221 11111
方法 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;
矩阵问题
1. 给一个二维数组 A 赋值如下数据: 01111 -1 0 1 1 1 -1 -1 0 1 1 -1 -1 -1 0 1 -1 -1 -1 -1 0
对角线下面 i>j
对角线上面 i<j 对角线 i==j
2. 输出以下 5×5 的矩阵 11111 21111 32111 43211 54321
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++)
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
1 3 6 10 15
2 5 9 14
4 8 13
{ 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 56 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"); } }
{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);
{ 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");
}
}
副对角线及其下面 i+j=n+1,a[i][j]=n+1-j
} 方法 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++)
7 12
拟人法:
11
#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)
}
}
3) 左下拐角
副对角线上面 i+j=n+1,a[i][j]=j
123 122
#include<stdio.h>
111
副对角线及其下面 i+j=n+1,a[i][j]=n+1-i
void main()
{ int i,j,k,n;
printf("n : ");
scanf("%d",&n);
for(i=1;i<=n;i++)
对角线下面 i>j,a[i][j]=(i-j)+1
对角线及对角线上面 i<=j
3. 拐角矩阵 1) 左上拐角
111 122 123
对角线下面 i>j,a[i][j]=j
#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<=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"); }
解析法:按区域填空 #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++)
#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;}
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++)
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");
for(j=1;j<=n;j++) { k=i>j?j:i;
printf("%4d",k); } printf("\n"); } }
对角线及对角线上面 i<=j,a[i][j]=i
2) 右下拐角
321 221 111
对角线及对角线上面 i<=j,a[i][j]=n+1-j
对角线下面 i>j,a[i][j]=n+1-i #include<stdio.h>
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
{i=j+1;j=1;a[i][j]=k;}
else
{i--;j++;a[i][j]=k;} for(i=1;i<=n;i++)
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
{
for(j=1;j<=n;j++)
{ if(i+j<=n+1)
printf("%4d",j);
else
printf("%4d",n+1-i);
}
printf("\n");
}
}
4) 右上拐角 副对角线上面 i+j=n+1,a[i][j]=i
111 221
#include<stdio.h>
321
void main()