环绕打印1开始的自然数---螺旋

用你熟悉的语言编写一个打印程序输入一个自然数N后,打印1至N的所有自然数,打印结果是环绕方式, 效果 如下:    
  21 ... N-1 N  
  20 7 8 9 10  
  19 6 1 2 11  
  18 5 4 3 12  
  17 16 15 14 13   
 

#include<iomanip.h>  
  void   main()  
  {  
  int   i,k,n,m,x0,y0,x1,y1,z=0;  
  while(1){  
  cout<<"请输入行数(行数>0):";  
  cin>>n;  
  if(n>0)  
  break;}  
  int   a[20][20];  
  m=n*n;  
   
  if(n%2==0){  
  i=0,k=0,x1=n,y1=n,x0=0,y0=0;  
  while(1){  
              for(k;k<y1;k++)  
  a[i][k]=m--;  
  y1--,i++,k--;  
      for(i;i<x1;i++)  
      a[i][k]=m--;  
      x1--,k--,i--;  
      for(k;k>=y0;k--)  
      a[i][k]=m--;  
      y0++,i--,k++;  
      for(i;i>x0;i--)  
      a[i][k]=m--;  
      x0++,k++,i++;  
  if(m<1)  
  break;}  
  }  
  if(n%2!=0){  
  i=n-1,k=n-1,x1=n,y1=n,x0=0,y0=0;  
  while(1){  
         
      for(k;k>=y0;k--)  
      a[i][k]=m--;  
      y0++,i--,k++;  
      for(i;i>=x0;i--)  
      a[i][k]=m--;  
      x0++,k++,i++;  
            for(k;k<y1;k++)  
  a[i][k]=m--;  
  y1--,i++,k--;  
      for(i;i<x1-1;i++)  
      a[i][k]=m--;  
      x1--,k--,i--;  
  if(m<1)  
  break;}  
  }  
  for(i=0;i<n;i++)  
  {  
  for(k=0;k<n;k++)  
  cout<<setw(4)<<a[i][k];  
  cout<<endl;  
  }  
  cout<<endl;  
  }  

#include   <iostream.h>  
  #include   <math.h>  
   
  int   a[100][100];  
   
  void   main()  
  {  
  int   n,   c,   i   =   50,   j   =   50,   temp   =   1,   k   =   1,   num   =   1;  
   
  cin   >>   n;  
  // 模拟螺旋填数  
  a[50][50]   =   1;  
  for   (c=1;   c<=(int)sqrt(n)-1;   ++c)  
  {  
  k   =   temp;  
   
  while   (k>0)   //向右  
  {  
  ++j;  
  a[i][j]   =   ++num;  
  --k;  
  }  
  k   =   temp;  
   
  while   (k>0)   //向下  
  {  
  ++i;  
  a[i][j]   =   ++num;  
  --k;  
  }  
  k   =   ++temp;  
   
  while   (k>0)   //向左  
  {  
  --j;  
  a[i][j]   =   ++num;  
  --k;  
  }  
  k   =   temp;  
   
  while   (k>0)   //向上  
  {  
  --i;  
  a[i][j]   =   ++num;  
  --k;  
  }  
   
  ++temp;  
  }  
  // 输出  
  for (int   ii=i;   ii<=i+(50-i)*2+1;   ++ii)  
  {  
  for(int   jj=j;   jj<=j+(50-j)*2+1;   ++jj)  
  {  
   
  if   (a[ii][jj]>0   &&   a[ii][jj]<=n   )  
  {  
  cout   <<   a[ii][jj]   <<   "   ";  
  if   (a[ii][jj]<10) //   多输出一个空格站位  
  cout   <<   "   ";  
  }  
  else   if(a[ii][jj]   >   n)   {cout   <<   "       ";}    
  }  
  cout   <<   endl;  
  }   
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值