A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

啥东西!!!!!!!!!
回复 使用道具 举报
黑马田杰 来自手机 中级黑马 2013-5-1 08:44:49
102#
挑战一下
回复 使用道具 举报
本帖最后由 清朗的晨风 于 2013-5-1 09:00 编辑

终于写好了,完全自己写的,没有任何百度。。。希望滔哥指点下。
  1. class Program
  2.     {
  3.         static int find(int i, int j, int n)
  4.         {
  5.             if (n % 2 == 1)//边长为奇数时调用这个
  6.             {
  7.                 if (i == 1) return n * (n - 1) + j;
  8.                 if (j == 1) return n * (n - 1) + 2 - i;
  9.                 if (i == n) return (n-1) * (n-1) - j + 2;
  10.                 if (j == n) return (n-2) * (n - 2)-1 + i;
  11.                 return find(i - 1, j - 1, n - 2);//递归调用内圈
  12.             }
  13.             else//边长为偶数数时调用这个
  14.             {            
  15.                 if (i == n) return n * n - j + 1;
  16.                 if (j == n) return n * n - 2 * n + 1 + i;
  17.                 if (i == 1) return (n -1)* (n - 2) + j;
  18.                 if (j == 1) return (n - 1) * (n - 2) + 2 - i;
  19.                 return find(i-1, j-1, n-2);//递归调用内圈
  20.             }
  21.         }

  22.         static void Main(string[] args)
  23.         {
  24.             int n, i, j;
  25.             Console.Write("请输入一个数字:");
  26.             if (Int32.TryParse(Console.ReadLine(), out n))
  27.             {
  28.                 int[,] number = new int[n + 2, n + 2];//定义个二维数组
  29.                 for (i = 1; i <= n; i++)
  30.                     for (j = 1; j <= n; j++)
  31.                         number[i, j] = find(i, j, n);

  32.                 for (i = 0; i <= n + 1; i++)
  33.                 {
  34.                     for (j = 0; j <= n + 1; j++)
  35.                     {
  36.                         if (i == 0 || j == 0 || i == n + 1 || j == n + 1)
  37.                             Console.Write("  * ");//打印最外层的*
  38.                         else
  39.                             Console.Write("{0,4}", number[i, j]);
  40.                     }
  41.                     Console.WriteLine();
  42.                 }
  43.                 Console.ReadKey();
  44.             }
  45.             else
  46.                 Console.WriteLine("输入的不是数字");
  47.         }
  48.     }
复制代码

评分

参与人数 1技术分 +4 黑马币 +3 收起 理由
黄玉昆 + 4 + 3

查看全部评分

回复 使用道具 举报
看题。。。。。。。。。。。。。。。。。。。。
回复 使用道具 举报
尝试一下。
回复 使用道具 举报
陈圳 发表于 2013-4-30 10:40

这个设置作者可见,我到时候有空告诉你啊,你也可以私下问我,现在有点忙,嘿嘿
回复 使用道具 举报
曹睿翔 发表于 2013-4-30 13:13
我来晚了啊,玉圣!时间不对吧,48小时not equal to今天十点到明天吧9点吧,我还在店里,回宿舍看看
我的网 ...

代码稀少?还是觉得太多代码了,没来得及继续抽取
需要的话我画出图形步骤,以前没做个这类型题,不知道解决的最简单的思路,有好的发来看看
测试代码不去为好,自己回头看可以知道怎么解决问题的

点评

我点评用错词了?额,我是说注释稀少,不是代码。  发表于 2013-5-1 14:18
回复 使用道具 举报
李德全 发表于 2013-4-30 09:55
看看啥题

做出来啦,嘻嘻请老师指导!

恩恩,谢谢黄老师指导,我会改正的。

点评

额,我不是老师,是和你一样的正在为进入黑马奋斗的一员,希望共同进步,加油  发表于 2013-5-1 14:18
回复 使用道具 举报
顶版主,看看先
回复 使用道具 举报
To 金牌黑马 2013-5-1 10:56:52
110#
我要挑战
回复 使用道具 举报
杞文明 发表于 2013-5-1 02:40
弄了一哈! 哎!  好麻烦哦!

后来修改 忘记了  呵呵
回复 使用道具 举报
搞这么神秘干什么

点评

你也来试试,要是都看到题了,那就没法通过回复的时间评分了。  发表于 2013-5-1 14:19
回复 使用道具 举报
刘胜寒 发表于 2013-4-30 13:33

要是个0
应该输出
**
**
是不是...
笔记本到了...
系统崩了...

点评

额。你的啥系统啊,去系统之家下一个吧,刚到就崩了?太犀利了  发表于 2013-5-1 14:18
回复 使用道具 举报
李德全 发表于 2013-5-1 10:37
恩恩,谢谢黄老师指导,我会改正的。

额,我不是老师,是和你一样的正在为进入黑马奋斗的一员,希望共同进步,加油
回复 使用道具 举报
刘胜寒 发表于 2013-5-1 11:42
要是个0
应该输出
**

额。你的啥系统啊,去系统之家下一个吧,刚到就崩了?太犀利了
回复 使用道具 举报
我也来看一下
回复 使用道具 举报
曹睿翔 发表于 2013-5-1 10:31
代码稀少?还是觉得太多代码了,没来得及继续抽取
需要的话我画出图形步骤,以前没做个这类型题,不知道 ...

我点评用错词了?额,我是说注释稀少,不是代码。
回复 使用道具 举报
郭利超 发表于 2013-5-1 11:41
搞这么神秘干什么

你也来试试,要是都看到题了,那就没法通过回复的时间评分了。
回复 使用道具 举报
本帖最后由 崔宏奎 于 2013-5-1 14:22 编辑

滔哥这个题,本来看的时候就是个转圈的写入数字,结果分析了一下才明白不是那么好写,贴出来思路与大家分享:
1.找规律,本想着三个就会有规律,还是画了四个才找出来:

在不看外围的“*”情况下,发现的规律: 1.用户输入的n和最后的图形长宽一样,也就是说n=3时,一共3*3=9个数,n=4时16个数.

2.找了找每次n+1时,增长的规律:

n=4时,在3*3的基础上,右边和下边各增加一条边,拼成一个4*4的图形。
n=5时,在4*4的基础上,在左边和上边增加一条边,拼成一个5*5的图形。
。。。。。。
规律差不多找到了,n是个大于等于1的整数,第n条边有n个数字,第n条边的位置是由(n是否为奇偶数)确定的。

3.写代码了:
我的思路是这样的,
a.用一个两维数组实现数据的存储
b.数字是每次+1,就用一个变量来表示,变量每次赋值完之后+1
c.数字从1开始,一共n*n个,的起始位置也比较好确定,奇数偶数都在中间,(n-1)/2就算出了位置
d.每次赋值时需要上一个数字所在的位置,用两个变量来保存col,row

然后从中间开始循环,
第一圈时,n=1,只有1的位置有数字,图形1*1=1
第二圈时,n=2,偶数!在右面增加一个数,然后在上一个数字的右面,下面增加一条边,边长为1个元素
第二圈时,n=3,奇数!在左面增加一个数,然后在上一个数字的左面,上面增加一条边,边长为2个元素
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Timers;

  6. namespace Question
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             //计数:
  13.             int start = 1;
  14.             //保存用户输入的值
  15.             int num;
  16.             string str;
  17.             do
  18.             {
  19.                 Console.Write("请输入一个整数:");
  20.                 str = Console.ReadLine();
  21.             } while (!int.TryParse(str, out num) || num < 1);

  22.             string[,] arr = new string[num + 2, num + 2]; //创建保存数据用的数组
  23.             //计算起始位置:
  24.             int col = (num +1) / 2, row = (num + 1) / 2;  //pos=1;
  25.             //第一个点赋值
  26.             arr[col, row] = start++.ToString();

  27.             //n>2时,开始循环
  28.             for (int i = 0; i < num - 1; ++i)
  29.             {
  30.                 if (i % 2 == 1)   //单数
  31.                 {
  32.                     //单数时,将左面的单元格赋值
  33.                     arr[col, --row] = start++.ToString();
  34.                     //上移
  35.                     for (int j = 0; j <=  i; ++j)
  36.                     {
  37.                         arr[--col, row] = start++.ToString();
  38.                     }
  39.                     //右移
  40.                     for (int j = 0; j <=  i; ++j)
  41.                     {
  42.                         arr[col, ++row] = start++.ToString();
  43.                     }
  44.                 }
  45.                 else   //偶数
  46.                 {
  47.                     //偶数时,将右面的单元格赋值
  48.                     arr[col, ++row] = start++.ToString();
  49.                     //下移
  50.                     for (int j = 0; j <= i; ++j)
  51.                     {
  52.                         arr[++col, row] = start++.ToString();
  53.                     }
  54.                     //左移
  55.                     for (int j = 0; j <=  i ; ++j)
  56.                     {
  57.                         arr[col, --row] = start++.ToString();
  58.                     }

  59.                 }

  60.             }
  61.             //在外围加上"*"
  62.             for (int i = 0; i < num + 2; ++i)
  63.             {
  64.                 arr[0, i] = "*";
  65.                 arr[i, 0] = "*";
  66.                 arr[i, num + 1] = "*";
  67.                 arr[num + 1, i] = "*";
  68.             }
  69.             //打印数组元素
  70.             PrintArr(arr);

  71.             Console.ReadKey();

  72.         }
  73.         //打印函数
  74.         public static void PrintArr(string[,] arr)
  75.         {
  76.             int len = arr.GetLength(0);
  77.             for (int i = 0; i < len; ++i)
  78.             {

  79.                 for (int j = 0; j < len; ++j)
  80.                 {
  81.                     Console.Write("{0}\t", arr[i, j]);
  82.                 }
  83.                 Console.WriteLine();
  84.             }
  85.         }
  86.       
  87.     }
  88. }
复制代码

Question.rar

26.66 KB, 下载次数: 4

点评

不过,希望你能把注释写清楚些,这样会好一点  发表于 2013-5-1 12:50
好吧,是我看错了,原来你用的是C#写的,我真心晕啊,不过运行了,很好,就是输入0的时候,应该有个提示比较好  发表于 2013-5-1 12:37

评分

参与人数 1技术分 +5 黑马币 +3 收起 理由
黄玉昆 + 5 + 3 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 bianbian18 于 2013-5-2 00:52 编辑

看看~!
看错题了{:soso_e109:}。。。要用数组,不过这的确是我自己做出来的。。。实在是抗不住咯,看在研究了两小时的份上
给点技术分吧。。。

--------------------------------以下是分析和代码----------------------------

/*
可以如图那样将这个螺旋矩形分解为一圈一圈的。当只有1时,设这个螺旋结果的圈数为0;
元素1被一圈数字包围,圈数为1;被两圈包围,圈数为2;被三圈包围,圈数为3;一次类推
每行打印元素count的个数与loop的关系:
loop=0→count=0
loop=1→count=3
loop=2→count=5
loop=3→count=7
得出loop与count的关系为:count=loop*2+1
在看圈数(设为loop)和左上顶点的数字(设为leftTop)关系:
loop=0→leftTop=1
loop=1→leftTop=7
loop=2→leftTop=21
loop=3→leftTop=43
leftTop=(loop*2+1)(loop*2+1)-(loop*2)
再设每圈左下顶点的数字为leftBottom,右上顶点为rightTop,右下为rightBottom
因为每圈上有count个元素,则在同一边上顶点之间的步长值为:x=count-1=loop*2
则:leftBottom=leftTop-x=((loop*2+1)(loop*2+1)-(loop*2))-(loop*2)=(loop*2+1)(loop*2+1)-loop*4
    rightTop=leftTop+x=((loop*2+1)(loop*2+1)-(loop*2))+loop*2=(loop*2+1)(loop*2+1)
    rightBottom=leftBottom-x=(loop*2+1)(loop*2+1)-loop*2
如图给这个螺旋结构加上坐标,元素1为(0,0),x正半轴向上,y正半轴向右
然后将每个顶点的值当做每个边的基础值,根据这个基础值去算每个边上每个元素的值,如图所示
控制台每输出一个数,都要去检查这个数是位于那一圈上的,然后根据相应圈上相应边的基础值算出每个
元素的值,并输出
判断元素在哪个圈上的方法?
如 21的坐标为(-2,2),在第二圈上
   45的坐标为(-1,3),在第三圈上
   33的坐标为(-3,1),在第三圈上
   从以上可得规律:x,y的绝对值谁大,那该元素就在第几圈上
最后,就是每个边上的每个元素值由哪个顶点基数算出?
这里我们取每基数所管边上的任意一个元素的坐标跟该基数坐标进行比较,如下:
比如第二圈:
21(-2,2)这个顶点基数所在管的左边,18(-2,-1)
17(-2,-2)这个顶点基数所在管的下边,14(1,-2)
13(2,-2)这个顶点基数所在管的右边,11(2,0)
25(2,2)这个顶点基数所在管的右边,24(1,2)
得出:1.当元素的x坐标等于(-loop)时,左边上元素由leftTop基数算出
      2.当元素的y坐标等于(-loop)时,下边边上元素由leftBottom基数算出
   3.当元素的x坐标等于(loop)时,右边边上元素由rightBottom基数算出
   4.当元素的y坐标等于(loop)时,上边边上元素由rightTop基数算出

*/
import java.io.*;
class Demo
{
public static void main(String[] args)
{
  
  int i=3;//代表圈数
  print(i);
}
public static void print(int loop)
{
  star(loop);
  for(int y=-loop+2;y<(loop);y++)  
  { //每行打印的元素个数与loop的关系为(loop*2+1),因为我是围绕1做的,所以要把第一行去掉
   System.out.print("* ");
   for(int x=-loop+2;x<(loop);x++)
   {//因为是个n*n的矩形,所以打印的行数跟每行打印的个数一样,要把第一列去掉
    System.out.printf("%4d", result(x,y));
   }
   System.out.println("  *");
  }
  star(loop);
}
public static int result(int x,int y)
{
  int loop = getLoop(x,y);   //得到没输出一个元素,先判断在哪一圈上
  int leftTop = (loop*2+1)*(loop*2+1)-(loop*2);//左上顶点的值
  int leftBottom = (loop*2+1)*(loop*2+1)-loop*4;//左下顶点的值
  int rightTop = (loop*2+1)*(loop*2+1);//右上顶点的值
  int rightBottom = (loop*2+1)*(loop*2+1)-loop*6;//右下定点的值
  if(y == -loop) //元素y=loop,是上边的边,则元素结基于rightTop算出
  {
   return rightTop-(loop-x);
  }
  else if(y == loop)//下
  {
   return leftBottom-(loop+x);
  }
  else if(x==loop)//右
  {
   return rightBottom-(loop-y);
  }
  else//左
  {
   return leftTop-(loop+y);
  }
}
public static int getLoop(int x,int y)//得到元素所在的圈
{
  int loop;
  if(x<0)
   x=-x;
  if(y<0)
   y=-y;
  return loop = x>y?x:y;
}
public static void star(int loop)//打印*
{
  for(int i=0;i<=2*loop-1;i++)
  {
   System.out.print("*   ");
  }
  System.out.println();
}
}

12.jpg (96.38 KB, 下载次数: 0)

12.jpg

113.jpg (9.17 KB, 下载次数: 0)

113.jpg

点评

思路很不错的,注释也很好,层次也有,但是只要你在稍微改改,就很不错了,可是你没按要求做,所以分数少了点,不过,鼓励鼓励,继续加油啊  发表于 2013-5-2 11:04

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马