这种题目一般都是画出前进方向,然后找规律即可,要注意特殊情况的考虑
#include<stdio.h> #include<stdlib.h> int main() { int n,i,j,k,x,y,flag=0,sum=0; //建立动态数组 scanf("%d",&n); int **a; a=(int**)malloc(sizeof(int*)*n); if(a==NULL) { printf("Out of memory!\n"); exit(-1); } for(i=0; i<=n-1; i++) { a[i]=(int*)malloc(sizeof(int)*n); if(a[i]==NULL) { printf("Out of memory!\n"); exit(-1); } } if(n==1) printf("1\n1"); else {//根据→↑←←↓↓→→→↑↑↑←←←←↓↓↓↓→→→→ 找规律 i=0; j=1; x=(n-1)/2; y=x; a[x][y]=j;//初始化到中央位置 while(flag==0) { i++; for(k=1; k<=i; k++) { j++; y++; a[x][y]=j; if(x==n-1&&y==n-1) { flag=1; break;//最后一步在第一个循环里,做到两重跳出 } } if(flag==1) break; for(k=1; k<=i; k++) { j++; x--; a[x][y]=j; } i++; for(k=1; k<=i; k++) { j++; y--; a[x][y]=j; } for(k=1; k<=i; k++) { j++; x++; a[x][y]=j; } } for(i=0; i<=n-1; i++) { for(j=0; j<=n-1; j++) { printf("%d ",a[i][j]); if(i==j||i+j==n-1) sum+=a[i][j];//对角线和 } printf("\n"); } printf("%d",sum); } return 0; }
#include<stdio.h> #include<stdlib.h> int main() { int n,circle=1,j,k,count=1,x=1,y=1,flag=0; scanf("%d",&n); if(n==1) { printf("1/1"); } else { for(;;) { y++; count++; if(count==n) break; for(k=1;k<=2*circle-1;k++) { x++;y--; count++; if(count==n) { flag=1; break; } } if(flag==1) break; x++; count++; if(count==n) break; for(k=1;k<=2*circle;k++) { x--;y++; count++; if(count==n) { flag=1; break; } } if(flag==1) break; circle++; } printf("%d/%d",x,y); } return 0; }
时间: 2024-10-05 04:58:16