1,根据输入数字,动态分配二维数组;
#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;
}