1,根据输入数字,动态分配二维数组;
2,一次写一圈数字(就是转四个边),如此循环,直到圈的宽度为1为止 3,输出结果到文件(在D盘里)#include"stdafx.h"#include"stdio.h"#include"stdlib.h"#include"malloc.h"int main(){ int num=1;//记录数到几了,比如n=4,就是1-16 FILE *fp; int i=0;//行号 int j=0;//列号 int r=0;//行列转换记录,0为行,1为列 int n=0;//输入的数字 int **a;//存放每一行的首地址 int l; int k1;//临时标号 int k2;//临时标号 //输入 printf("please input your number:/n"); scanf("%d",&n); if( n < 1 || n > 316)//对输入进行检验 { printf("Sorry, the number should be between 1 and 316,please retry!!/n"); system("pause"); exit(0); } //动态生成二维数组 a = (int **)malloc(sizeof(int *) * n);//每一行的地址 for(k1 = 0; k1 < n; k1++) { a[k1] = (int *)malloc(sizeof(int) * n);//存放每一行的数字 } l = n; //写入数字 while(l > 1) { num = SingleCircle(a,num,i,j,l); i++; j++; l = l-2; } if(n % 2 != 0) a[i][j] = num; //输出到文件 fp = fopen("d://result.txt","w+");//文件的地址 for(k1 = 0 ; k1 < n ; k1++) { for(k2 = 0; k2 < n; k2++) { if(a[k1][k2] < 10) fprintf(fp,"%d ",a[k1][k2]);//每个数最多占五位,就是最大的n为316 else if(a[k1][k2] < 100) fprintf(fp,"%d ",a[k1][k2]); else if(a[k1][k2] < 1000) fprintf(fp,"%d ",a[k1][k2]); else if(a[k1][k2] < 10000) fprintf(fp,"%d ",a[k1][k2]); else if(a[k1][k2] < 100000) fprintf(fp,"%d ",a[k1][k2]); } fprintf(fp,"/n"); } fclose(fp); printf("please see your result in: d://result.txt/n"); system("pause"); return 0;}int SingleCircle(int **a,int initnum,int initi,int initj,int length)//生成一圈数字{ int count = 1;//中间的变量,是从1-(length-1)的 int t = 0;//标号,记录变数,0-3 int r = 0;//控制行标也就是i的变化 int c = 1;//控制列标也就是j的变化 int i = initi;//初始位置 int j = initj;//初始位置 int num = initnum;//初始的数字大小 while(t < 4) { for(count = 1 ;count < length; count++) { a[i][j] = num; i += r; j += c; num++; } t++; if(t == 0 || t == 1)//向前加 { r = (++r % 2); c = (++c % 2); } else //向回减 { r = -(++r % 2); c = -(++c % 2); } } return num;}