⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 magicmatrix.c

📁 自己做的常用库和实现的数据结构。public domain.
💻 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 + -