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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我要挑战一下!
回复 使用道具 举报
谭威 发表于 2013-4-30 17:47
la aa a a a aa

:L,我得先看到题目呢
回复 使用道具 举报
hyw840705183 发表于 2013-4-30 09:09
我看下什么题目

以下是我的代码:运行结果如图

是哦,好像没考虑到,我修改下。。。
回复 使用道具 举报
{:soso_e113:}~~
老师辛苦了~~我是学。Net的,想参加最近的一期黑马,昨天看到滔哥在群里的留言就写了,也没看是JAVA还是C#~
注释我一定会注意的{:soso_e113:}~
回复 使用道具 举报
我测试了,没有bug啊。。。是滔哥在我们.net群里发的,我过来挑战下。这是用C#写的控制台应用程序。我测试了,完全正常。麻烦你再试下,谢谢。
回复 使用道具 举报
过来看看。。
回复 使用道具 举报
清朗的晨风 发表于 2013-5-1 13:23
我测试了,没有bug啊。。。是滔哥在我们.net群里发的,我过来挑战下。这是用C#写的控制台应用程序。我测试 ...

不好意思啊,我的问题,确实不知道滔哥在.net宣传了,我还以为是java呢,对不起啊,我在运行一下。
回复 使用道具 举报
看看。
回复 使用道具 举报
崔宏奎 发表于 2013-5-1 13:20
~~
老师辛苦了~~我是学。Net的,想参加最近的一期黑马,昨天看到滔哥在群里的留言就写了,也 ...

没关系的,只要你参与了,我就会想办法测试运行的,并且会给你相应的技术分的。写的不错,很好
回复 使用道具 举报
回帖仅作者可见,我看不到你的回帖。不好意思。
回复 使用道具 举报
用C#写的,不会java

MySecondProject.rar

24.67 KB, 下载次数: 28

回复 使用道具 举报
我来试试
回复 使用道具 举报
本帖最后由 strawberry2013 于 2013-5-2 09:32 编辑
  1. import javax.swing.JOptionPane;

  2. class Demo
  3. {
  4.         private static int MAX_N = 10;//支持最大自然数为20
  5.         public static void main(String[] args)
  6.         {
  7.                 int[][] val = new int[MAX_N][MAX_N];       
  8.                 int n = getNumber("请输入自然数N");//获取自然数N

  9.                 if(n<=MAX_N && n>=1)                                //判断自然数N的有效范围
  10.                 {
  11.                         if(n%2 == 1)       
  12.                                 exec(val, 0, n-1, n);
  13.                         else
  14.                                 exec(val, n-1, 0, n);
  15.                 }
  16.                 show(val, n);
  17.         }

  18.         public static void exec(int[][] val, int m, int n, int len)
  19.         {
  20.                 int i, key;                        //exec(val, m, n, len) ->m,n分别代表目标点的横纵坐标 len表示该目标运动的长度;

  21.                 if (len%2 == 0)
  22.                         key = 1;                //判断运动的方向 key=1表示向右或者向上 key=-1表示相反方向
  23.                 else
  24.                         key = -1;

  25.                 for(i=0; i <= len-1; i++)
  26.                 {
  27.                         val[m][n+key*i] = len*len - i;
  28.                 }
  29.                 int temp = val[m][n+key*(len-1)];        //存储拐点的val值
  30.                 for(i=0; i<=len-1; i++)
  31.                 {
  32.                         val[m-key*i][n+key*(len-1)] = temp - i;
  33.                 }
  34.                 if (len == 1)
  35.                         return;
  36.                 exec(val, m-key*(len-1), n+key*(len-2), len-1);
  37.         }

  38.         public static void show(int[][] val, int n)//打印信息
  39.         {
  40.                 for(int i=0; i<n; i++)
  41.                 {
  42.                         for(int j=0; j<n; j++)
  43.                         {
  44.                                 if(val[i][j] != 0)
  45.                                 System.out.print(val[i][j]+"\t");
  46.                         }
  47.                         System.out.println("\n");
  48.                 }
  49.         }
  50.         public static int getNumber(String message)//获取自然数n值
  51.         {
  52.                 int number = 0;
  53.                 String str = JOptionPane.showInputDialog(null, message, "提示",JOptionPane.INFORMATION_MESSAGE);
  54.                 try
  55.                 {
  56.                         number = Integer.parseInt(str); // 得到输入的正整数
  57.                 }
  58.                 catch( Exception e)
  59.                 {
  60.                         JOptionPane.showMessageDialog(null, "输入非数字字符\n程序结束", "错误警告", JOptionPane.ERROR_MESSAGE);
  61.                         return -1; // 输入的不是数字字符,程序结束
  62.                 }
  63.                 if (number < 1 || number > MAX_N)
  64.                 {
  65.            JOptionPane.showMessageDialog(null, "自然数N范围为:1-"+MAX_N+"\n程序结束", "错误警告",JOptionPane.ERROR_MESSAGE);
  66.            return -1; // 输入的数不在范围,程序结束
  67.                  }
  68.                  else
  69.                          return number;
  70.         }

  71. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
接受挑战
回复 使用道具 举报
这个注释比较好。。。。
  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);//递归调用内圈的矩阵,边长-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);//递归调用内圈的矩阵,边长-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.                 if (n <= 0)//判断输入的数字是否有效
  29.                 {
  30.                     Console.WriteLine("输入的数字无效,请输入大于0的整数");
  31.                     return;
  32.                 }
  33.                 int[,] number = new int[n + 2, n + 2];//定义个二维数组
  34.                 for (i = 1; i <= n; i++)//遍历整个矩阵
  35.                     for (j = 1; j <= n; j++)
  36.                         number[i, j] = find(i, j, n);//把数值存到数组中

  37.                 for (i = 0; i <= n + 1; i++)
  38.                 {
  39.                     for (j = 0; j <= n + 1; j++)
  40.                     {
  41.                         if (i == 0 || j == 0 || i == n + 1 || j == n + 1)
  42.                             Console.Write("  * ");//打印最外层的*
  43.                         else
  44.                             Console.Write("{0,4}", number[i, j]);
  45.                     }
  46.                     Console.WriteLine();
  47.                 }
  48.                 Console.ReadKey();
  49.             }
  50.             else
  51.                 Console.WriteLine("输入的不是数字");
  52.         }
  53.     }
复制代码
回复 使用道具 举报
刘胜寒 发表于 2013-5-1 11:42
要是个0
应该输出
**

win8不想用....
然后就搞啊搞...
然后就崩了...
现在正在安装win7系统哈哈

点评

额,真崩溃  发表于 2013-5-1 16:31
回复 使用道具 举报
看一下 先看题目再说
回复 使用道具 举报
搞过acm的路过
C语言版
#include "stdafx.h"
#include <stdio.h>
int main()
{
        int n,a[21][21],i,j,k;
        while(scanf("%d",&n),n)
        {
                for(i=0;i<n;i++)
                for(j=0;j<n;j++)
                a[i][j]=0;
                k=n*n;j=0,i=0;
                while(k>=1)
                {
                        while(a[i][j]==0&&j<n)
                        {
                                a[i][j]=k--;
                                j++;
                        }
                        j--;i++;
                        while(a[i][j]==0&&i<n)
                        {
                                a[i][j]=k--;
                                i++;
                        }
                        i--;j--;
                        while(a[i][j]==0&&j>=0)
                        {
                                a[i][j]=k--;
                                j--;
                        }
                        j++;i--;
                       
                        while(a[i][j]==0&&i>=0)
                        {
                                a[i][j]=k--;
                                i--;
                        }
                        i++;j++;
                }
                for(i=0;i<n;i++)
                {
                        for(j=0;j<n-1;j++)
                        printf("%d ",a[i][j]);
                        printf("%d\n",a[i][n-1]);
                }
                printf("\n");
        }
        return 0;
}

点评

虽然我不怎么会c,但是你既然参与了,我也会看看的。你这个层次相对清晰,但是没注释,建议你加上相应的注释,谢谢思路。  发表于 2013-5-2 10:33

评分

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

查看全部评分

回复 使用道具 举报
我来看一下究竟是什么题目?
回复 使用道具 举报
本帖最后由 戴振良 于 2013-5-1 22:11 编辑

很有意思的一道题目,哎,总感觉自己在做这类题目的时候总是没有思路,尽管看过一些老毕的视频,对于陌生的题目总是找不到思路,我没做出来,我说说我的做题思路,希望可以给我指点指点应该怎样思考。
我的思路是这样的:
一、
一看那图,第一感觉,对,看得出这图应该是有规律的,再想怎么做的时候吧,一个字:晕。
于是我只能先从简单的来,我看外面那圈星星是比较有规律的,以前老毕也讲过星星输出的一些例题,于是我先把这个星星给弄出来,n为3的打印结果为:
*        *        *        *        *
*                                      *
*                                      *
*                                      *
*        *        *        *        *
代码如下:
  1. public static void drawStar(int n) {
  2.                 if (n <= 0) {
  3.                         throw new IllegalArgumentException("参数n必须是大于或等于1的整数");
  4.                 }

  5.                 int starWidth = n + 2;       // 星星的宽度
  6.                 for (int i = 1; i <= starWidth; i++) {              // 控制输出的行数
  7.                         for (int j = 1; j <= starWidth; j++) {    // 控制输出的列数
  8.                                 if (j == starWidth) {                     // 如果是最后一列
  9.                                         System.out.print("*\n");
  10.                                 } else if ((i == 1 || i == starWidth || j == 1)) {    // 如果是第一行、或最后一行、或第一列
  11.                                         System.out.print("*\t");
  12.                                 } else {          // 其他情况                                       
  13.                                         System.out.print(" \t");
  14.                                 }
  15.                         }
  16.                 }
  17.         }
复制代码
二、
星星的输出实现了,我再想数字的输出,这数字的输出关键就在于找出他们的输出规律,对着那些数字看了许久,硬是没思路,于是还是只能从简单的入手,先来规规距距的输出数字,n为3效果如下:
1        2        3
4        5        6
7        8        9
代码如下:
  1. public static void drawNum(int n) {
  2.                 if (n <= 0) {
  3.                         throw new IllegalArgumentException("参数n必须是大于或等于1的整数");
  4.                 }
  5.                 int max = n * n;          // 最大输出数,可用来做结束循环的条件
  6.                 int currentNum = 1;    // 当前要输出的数
  7.                 for (int i = 1; i <= n; i++) {              // 控制输出的行数
  8.                         for (int j = 1; j <= n; j++) {     // 控制输出的列数
  9.                                 if(j!=n) System.out.print(currentNum + "\t");        // 如果不是最后一列
  10.                                 else System.out.print(currentNum + "\n");            // 其他情况
  11.                                 currentNum ++;
  12.                         }
  13.                 }
  14.         }
复制代码
三、
把上面两个效果整合如下:
*        *        *        *        *
*        1        2        3        *
*        4        5        6        *
*        7        8        9        *
*        *        *        *        *
代码如下:
  1. public static void drawCustomShape(int n) {
  2.                 if (n <= 0) {
  3.                         throw new IllegalArgumentException("参数n必须是大于或等于1的整数");
  4.                 }

  5.                 int starWidth = n + 2;    // 星星的宽度
  6.                 int max = n * n;            // 最大输出数,可用来做结束循环的条件
  7.                 int currentNum = 1;      // 当前要输出的数
  8.                 for (int i = 1; i <= starWidth; i++) {            // 控制输出的行数
  9.                         for (int j = 1; j <= starWidth; j++) {   // 控制输出的列数
  10.                                 if (j == starWidth) {                    // 如果是最后一列
  11.                                         System.out.print("*\n");
  12.                                 } else if ((i == 1 || i == starWidth || j == 1)) {        // 如果是第一行、或最后一行、或第一列
  13.                                         System.out.print("*\t");
  14.                                 } else {            // 其他情况
  15.                                         System.out.print(currentNum + "\t");
  16.                                         currentNum ++;
  17.                                 }
  18.                         }
  19.                 }
  20.         }
复制代码
四、
对于数字的螺旋状输出,我实在是找不出规律,所以代码是必定写不出来的。对于我这种笨脑筋,不知道如何思考,麻烦大家给指点指点!


版主,你好,看了您的点评,我也知道它是个正方形,所以我上面代码中外循环与内循环的条件是一样的。哎,我这人就是笨,死脑筋,我的思维不转弯,我就只知道用两个循环,一个循环控制行数,一个循环控制列数,我就只能想到这样:
肯定是一行一行输出的,一行之中又肯定是从左到右一个一个输出的。所以按这样想,比如n=4的那个图中的第二行数字:6  1  2  11,我实在是想不出一个循环怎样能连续输出这4个字的规律(因为死脑筋中认定只能是顺序的小从到大的输出或从大小到的顺序输出,像这种忽大忽小的输出实在是想不出规律),哎,我认输了,等待5月2号答案的公布。这就是人为什么要不断学习的道理了,如果不去学习,这道题就是让我想破头脑我也想不出来怎么做!

点评

不知道你有没有发现,这个题有一个不变的,就是是个矩形,不管你输入多少,都是矩形,既然是矩形,那么它的长度也是确定的。你可以从矩形下手  发表于 2013-5-1 19:02
前辈也来了,多多批评指正啊  发表于 2013-5-1 16:46

评分

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

查看全部评分

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