Please input a number:10 1 2 6 7 15 16 28 29 45 46 3 5 8 14 17 27 30 44 47 64 4 9 13 18 26 31 43 48 63 65 10 12 19 25 32 42 49 62 66 79 11 20 24 33 41 50 61 67 78 80 21 23 34 40 51 60 68 77 81 90 22 35 39 52 59 69 76 82 89 91 36 38 53 58 70 75 83 88 92 97 37 54 57 71 74 84 87 93 96 98 55 56 72 73 85 86 94 95 99 100 这是题目 下面是实现代码 #include "stdafx.h" #include <stdio.h> #include <malloc.h> void main() { printf("Please input a number(2~10):"); int size,maxNumber; bool flag=true; scanf("%d",&size); for (int i=0;i<80;i++) { printf("*"); } maxNumber=size*size; int* p=(int*)calloc(maxNumber,sizeof(int)); int** pRow=(int**)calloc(size,sizeof(int*)); int j=0; for (int i=0;i<maxNumber;i=i+size) { pRow[j]=&p[i]; j++; } int x=0,y=0,num=1; (pRow[y])[x]=num; while(true) { num++; if (flag) { x++; (pRow[y])[x]=num; while (true) { num++; x--; y++; (pRow[y])[x]=num; if(y==size-1) goto next; if (x==0) { flag=false; break; } } } else if (!flag) { y++; (pRow[y])[x]=num; while(true) { num++; x++; y--; (pRow[y])[x]=num; if(x==size-1) goto next; if (y==0) { flag=true; break; } } } } next: while (true) { num++; if (flag) { x++; (pRow[y])[x]=num; if(x==size-1) break; while (true) { num++; x++; y--; (pRow[y])[x]=num; if (x==size-1) { flag=false; break; } } } else if (!flag) { y++; (pRow[y])[x]=num; if (y==size-1) { break; } while(true) { num++; x--; y++; (pRow[y])[x]=num; if (y==size-1) { flag=true; break; } } } } for (int i=0;i<size;i++) { for (int j=0;j<size;j++) { printf("%d/t",(pRow[i])[j]); } printf("/n/n"); } } 写得比较仓促,代码还有许多可以优化的地方,不过倒是让我更好的熟悉,理解了指针和二重指针