2011-04-06 37 views
0

大家好大家 我试着解决星号树问题 ,发现我的代码不能正常工作,可以改进。用C创建星号树#

这是预期

输入输出:5

* 
    * * * 
* * * * * 
    * * * 
    * 

输入:4

* * * * 
    * * 
* * * * 

,这是我的代码

static void Main(string[] args) 
     { 
      Console.Write("input:"); 

      char input = Console.ReadKey().KeyChar; 

      if (char.IsDigit(input)) 
      { 
       int couter = (int)char.GetNumericValue(input); 

       Console.WriteLine(); 

       if (couter % 2 != 0) 
       { 

        for (int i = 1; i <= couter; i++) 
        { 

         for (int j = 3; j > i; j--) 
         { 

          Console.Write(" "); 

         } 

         for (int k = 1; k <= i; k++) 
         { 

          Console.Write(" *"); 

         } 

         Console.WriteLine(); 
        } 

        for (int i = couter - 1; i >= 3; i--) 
        { 
         for (int j = 1; j <= i; j++) 
         { 

          if (j <= couter - i) 
          { 
           Console.Write(" "); 
          } 
          else 
          { 
           Console.Write("* "); 
          } 
         } 

         Console.WriteLine(); 
        } 

       } 
       else 
       { 

        for (int i = couter; i > 3; i--) 
        { 
         for (int j = 1; j <= i; j++) 
         { 
          if (couter - i >= j) 
          { 
           Console.Write(" "); 
          } 
          else 
          { 
           Console.Write("* "); 
          } 
         } 

         Console.WriteLine(); 


        } 

        for (int i = couter - 1; i <= couter; i++) 
        { 
         for (int j = 0; j < i; j++) 
         { 
          Console.Write("* "); 
         } 

         Console.WriteLine(); 
        } 
       } 

      } 
     } 

请你能帮助我解决这个问题问题。

最近,我觉得我在算法和一个小复杂的问题很差。有没有人知道有用的链接,或者我可以如何提高这项技能,请让我知道。

感谢,

+2

3和6的所需输出如何? – 2011-04-06 18:36:54

+0

我认为你需要比5或4 Console.WriteLine()更通用的东西吗?我想你想打印一个大小为n的钻石,而不仅仅是5,我又对了吗? – digEmAll 2011-04-06 18:52:40

回答

1

检查这个网页,输入5(钻石):http://www.dreamincode.net/forums/topic/126715-diamond-asterisk/

我把它翻译为C# - 现在它显示与大小的钻石,你在变“行”设置:

int rows = 5; 
StringBuilder sb = new StringBuilder(); 
// top part 
for (int i = 1; i <= rows; i++) 
{ 
    for (int j = 1; j <= rows - i; j++) 
     sb.Append(' '); 
    for (int k = 1; k <= 2 * i - 1; k++) 
     sb.Append('*'); 
    sb.AppendLine(); 
} 
//bottom part 
for (int n = rows - 1; n > 0; n--) 
{ 
    for (int l = 1; l <= rows - n; l++) 
     sb.Append(' '); 
    for (int m = 1; m <= 2 * n - 1; m++) 
     sb.Append('*'); 
    sb.AppendLine(); 
} 
Console.Write(sb.ToString()); 
+0

Marek Kwiendacz,非常感谢。 – embarus 2011-06-22 10:28:42

1

我最初不愿将它张贴,因为它肯定闻起来像功课......

总之,这里的一块工作代码:

static void Main(string[] args) 
{ 
    Console.Write("input:"); 

    char input = Console.ReadKey().KeyChar; 

    if (char.IsDigit(input)) 
    { 
     int couter = (int)char.GetNumericValue(input); 
     Console.WriteLine(); 
     if (couter % 2 != 0) 
      PrintDiamond(couter); 
     else 
      PrintHourGlass(couter); 
    } 
    Console.ReadLine(); 
} 

private static void PrintDiamond(int couter) 
{ 
    bool moreAsterisks = true; 
    for (int row = 0; row < couter; row++) 
    { 
     int nAsterisks = moreAsterisks ? (2 * row) + 1 : 2 * (couter - row - 1) + 1; 
     int nSpaces = (couter - nAsterisks)/2; 

     if (row == (couter - 1)/2) 
      moreAsterisks = false; 

     for (int i = 0; i < nSpaces; i++) 
      Console.Write(" "); 
     for (int i = 0; i < nAsterisks; i++) 
      Console.Write("*"); 
     for (int i = 0; i < nSpaces; i++) 
      Console.Write(" "); 
     Console.WriteLine(); 
    } 
} 

private static void PrintHourGlass(int couter) 
{ 
    bool moreAsterisks = false; 
    for (int row = 0; row < couter - 1; row++) 
    { 
     int nAsterisks = moreAsterisks ? couter - 2 * (couter - row - 2) : couter - (2 * row); 
     int nSpaces = (couter - nAsterisks)/2; 

     if (row == (couter - 2)/2) 
      moreAsterisks = true; 

     for (int i = 0; i < nSpaces; i++) 
      Console.Write(" "); 
     for (int i = 0; i < nAsterisks; i++) 
      Console.Write("*"); 
     for (int i = 0; i < nSpaces; i++) 
      Console.Write(" "); 
     Console.WriteLine(); 
    } 
} 

P.S.: 它与任意数量的,不只是4-5 ...

+0

digEmAll,非常感谢。 – embarus 2011-06-22 10:27:56

0

这里是你的问题的一个精缩LINQ的解决方案:

class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Write("input: "); 
      string line = Console.ReadLine(); 

      int n; 
      if (!int.TryParse(line, out n)) 
      { 
       Console.WriteLine("Enter a valid integer number."); 
       return; 
      } 

      for (int i = 0; i < n; i++) 
      { 
       int l = Math.Abs(n - i * 2 - 1) + 1; 
       if (n % 2 != 0) l = n - l + 1; 

       Console.Write(Enumerable.Repeat(" ", n - l).DefaultIfEmpty("").Aggregate((a, b) => a + b)); 
       Console.WriteLine(Enumerable.Repeat("* ", l).DefaultIfEmpty("").Aggregate((a, b) => a + b)); 
      } 
     } 
    } 

这很简单;在循环内部,如果输入是偶数,第一行计算第i个钻石行的长度,第二行修正奇数输入的计算。剩下的两行使用一些LINQ技巧打印第i行。如果你不喜欢用LINQ炫耀,你可以用普通的for循环替换thoose行(这可能会更快)。然后代码将如下所示:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.Write("input: "); 
     string line = Console.ReadLine(); 

     int n; 
     if (!int.TryParse(line, out n)) 
     { 
      Console.WriteLine("Enter a valid integer number."); 
      return; 
     } 

     for (int i = 0; i < n; i++) 
     { 
      int l = Math.Abs(n - i * 2 - 1) + 1; 
      if (n % 2 != 0) l = n - l + 1; 

      //Console.Write(Enumerable.Repeat(" ", n - l).DefaultIfEmpty("").Aggregate((a, b) => a + b)); 
      //Console.WriteLine(Enumerable.Repeat("* ", l).DefaultIfEmpty("").Aggregate((a, b) => a + b)); 
      for (int c = 0; c < n - l; c++) Console.Write(" "); 
      for (int c = 0; c < l; c++) Console.Write("* "); 
      Console.WriteLine(); 
     } 
    } 
} 
+0

77v,非常感谢。 – embarus 2011-06-22 10:28:23