📄 magicmatrix.c
字号:
#include <stdio.h> #include <stdlib.h> void swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } void table(int n,int flag) { int i,a,b,c; switch(flag){ case 1:a=218;b=194;c=191;break; case 2:a=195;b=197;c=180;break; case 3:a=192;b=193;c=217;break; } printf("%c",a); for(i=1;i<4*n;i++) printf("%c",i%4==0?b:196); printf("%c\n",c); } void number(int n,int *p) { int i,j; char c=179; table(n,1); for(i=0;i<n;i++){ printf("%c",c); for(j=0;j<n;j++) printf("%-3d%c",*(p+i*n+j),c); printf("\n"); if(i!=n-1) table(n,2); else table(n,3); } } void check(int n,int *p) { int i,j,sum=n*(n*n+1)/2; printf("数字之和应为 %d*(%d*%d+1)/2=%d\n",n,n,n,sum); printf("按任一键继续:\n"); getchar(); printf("各行数字之和为:\n"); sum=0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%-3d",*(p+i*n+j)); if(j!=n-1) printf("+"); else printf("="); sum+=*(p+i*n+j); } printf("%d\n",sum); sum=0; } printf("按任一键继续:\n"); getchar(); printf("各列数字之和为:\n"); for(j=0;j<n;j++){ for(i=0;i<n;i++){ printf("%-3d",*(p+i*n+j)); if(i!=n-1) printf("+"); else printf("="); sum+=*(p+i*n+j); } printf("%d\n",sum); sum=0; } printf("按任一键继续:\n"); getchar(); printf("两对角线数字之和为:\n"); for(i=0,j=0;i<n&&j<n;i++,j++){ printf("%-3d",*(p+i*n+j)); if(i!=n-1) printf("+"); else printf("="); sum+=*(p+i*n+j); } printf("%d\n",sum); sum=0; for(i=0,j=n-1;i<n&&j>-1;i++,j--){ printf("%-3d",*(p+i*n+j)); if(i!=n-1) printf("+"); else printf("="); sum+=*(p+i*n+j); } printf("%d\n",sum); } void fit1(int n,int *p) { int i,j,k,l,m; for(i=0;i<n;i++) for(j=0;j<n;j++) *(p+i*n+j)=0; i=0; j=(n-1)/2; for(m=1;m<=n*n;m++){ *(p+i*n+j)=m; k=i-1; l=j+1; if(k==-1) k=n-1; if(l==n) l=0; if(*(p+k*n+l)!=0){ i++; continue; } i=k; j=l; } } void fit2(int n,int *p) { int i,i1,i2,i3,i4,j,j1,j2,j3,j4,k,l,*q; q=malloc(n*n/2); fit1(n/2,q); for(i1=0,i2=n/2,i3=0,i4=n/2,k=0;k<n/2;i1++,i2++,i3++,i4++,k++){ for(j1=0,j2=n/2,j3=n/2,j4=0,l=0;l<n/2;j1++,j2++,j3++,j4++,l++){ *(p+i1*n+j1)=*(q+k*n/2+l); *(p+i2*n+j2)=*(p+i1*n+j1)+(n/2)*(n/2); *(p+i3*n+j3)=*(p+i2*n+j2)+(n/2)*(n/2); *(p+i4*n+j4)=*(p+i3*n+j3)+(n/2)*(n/2); } } for(i=0;i<n/2;i++) for(j=0;j<(n/2-1)/2;j++) swap(p+i*n+j,p+(i+n/2)*n+j); for(i=0;i<n/2;i++) for(j=n-1;j>n-1-(n/4-1);j--) swap(p+i*n+j,p+(i+n/2)*n+j); swap(p+((n/2-1)/2)*n+(n/2-1)/2,p+((3*n/2-1)/2)*n+(n/2-1)/2); swap(p+((n/2-1)/2)*n,p+((3*n/2-1)/2)*n); } void fit3(int n,int *p) { int i,j,k,m=1; for(i=0;i<n;i++) for(j=0;j<n;j++) *(p+i*n+j)=m++; for(k=0;k<n;k+=4){ for(i=0,j=k;i<n/2;i++,j++){ if(j==n) j=0; swap(p+i*n+j,p+(n-1-i)*n+(n-1-j)); } for(i=0,j=n-1-k;i<n/2;i++,j--){ if(j==-1) j=n-1; swap(p+i*n+j,p+(n-1-i)*n+(n-1-j)); } } } void title() { int i; printf("\t\t\t"); printf("%c",201); for(i=0;i<=24;i++) printf("%c",205); printf("%c\n\t\t\t",187); printf("%c",186); printf(" 打印魔方阵程序 V1.00 %c\n\t\t\t%c",186,186); printf(" %c\n\t\t\t%c",186,186); printf(" 5.9.2004 %c\n\t\t\t",186); printf("%c",200); for(i=0;i<=24;i++) printf("%c",205); printf("%c\n",188); } int choise() { int c; printf("1.打印魔方阵\n"); printf("2.查看帮助\n"); printf("3.退出\n"); printf("选择:"); do{ c=getchar(); if(c==49) return 1; else if(c==50) return 2; else if(c==51) return 3; } while(1); } void print() { int n,*p,c; do{ printf("输入n:"); scanf("%d",&n); p=malloc(2*n*n); if(n<3){ printf("%d阶的魔方阵不存在!\n",n); goto a; } if(n>19){ printf("魔方阵将不能在一个正方形中显示!\n"); printf("你要继续吗?(Y/N)\n"); do{ c=getchar(); if(c=='y'||c=='Y') break; else if(c=='n'||c=='N') goto a; } while(1); } if(n%2!=0) fit1(n,p); else if(n%4!=0) fit2(n,p); else fit3(n,p); number(n,p); printf("是否要检验数字(Y/N)?\n"); do{ c=getchar(); if(c=='y'||c=='Y'){ check(n,p); break; } else if(c=='n'||c=='N') goto a; } while(1); a:; printf("你想要输出另一个魔方阵吗(Y/N)?\n"); do{ c=getchar(); if(c=='y'||c=='Y') break; else if(c=='n'||c=='N') return; } while(1); } while(1); } void help() { printf("n代表魔方阵的阶数,输入n值便可有一个大小为n*n的魔方阵.\n"); printf("检验数字表示求出魔方阵各行各列两对角线数字之和的过程.\n"); printf("按任一键确定:\n"); getchar(); } void main() { int i; title(); do{ i=choise(); if(i==1){ printf("%d\n",i); print(); } else if(i==2){ printf("%d\n",i); help(); } else if(i==3){ printf("%d\n",i); return; } } while(1); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -