现在的位置: 首页 > 综合 > 正文

[C]回环数(螺旋矩阵)

2017年12月18日 ⁄ 综合 ⁄ 共 1956字 ⁄ 字号 评论关闭

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;
}

抱歉!评论已关闭.