2016年4月30日 星期六

【C#】印 * 星號金字塔


老弟上大學了,回家考我這個,重點是要兩個迴圈解決,還真是差點燒了我這個除了 Google 什麼都不會的猴子腦筋。

這是結論,重點是絕對值跟想出後面的(i*2+1)的組合
static void Main()
{
    int input = int.Parse(Console.ReadLine());
    for (int i = 0; i < input; i++)
    {
        for (int j = 0; j < input - Math.Abs(input - (i * 2 + 1)); j++)
        {
            Console.Write("*");
        }
        Console.WriteLine();
    }
    Console.ReadLine();
}

我比較想講的是思考的技巧,首先
for (int i = 0; i < input; i++)
外迴圈決定的是行數,首圖我輸入 input = 10 所以有輸出星號的行數就是 10 行

再來,內迴圈的重點是
中間的條件,這裡決定了要印多少 *

如果你中間也是 j < input,那就會變成 10 * 10

所以印金字塔的重點就是,怎麼讓每一行要印的次數遞增或遞減,線索就是外迴圈 i 是回隨著每印一行增加的,所以可以用來調整第二行。 比方我需要遞減,那就是 j < 的數越來越小,所以
for (int j = 0; j < input - i; j++)

反之遞增的話就是 j < 的數要越來越大

想不出來?

我們再把線索縮小
for (int j = 0; j < ?; j++)
先想出在這裡我們需要的 ? 的組合是什麼以遞增來說就會是1、2、3...
而我們的素材有 i 跟 input,哪個比較容易達成這個條件呢?
for (int j = 0; j < i + 1; j++)
怎麼樣? 是不是簡單很多?

最後來重作一下大學的回家作業吧~
目標的三角形是兩個的話

- 的組合是 4、3、2、1
ABC的組合是 1、3、5、7、9

題目重點在

一、- 號只有四行有
實際上迴圈還是走五次,但最後一次不印任何東西,又 input - i 會是從 5 開始,所以只要多減一就達成條件了

二、要怎麼把 i 的 0、1、2、3、4 變成 1、3、5、7、9 呢?
列出來就很容易發現,公式就是 i + i + 1(或 i * 2 + 1),所以

string[] charAry = { "A", "B", "C", "D", "E" };
int input = 5;
for (int i = 0; i < input; i++)
{
    for (int j = 0; j < input - i - 1; j++)
    {
        Console.Write("-");
    }

    for (int j = 0; j < i * 2 + 1; j++)
    {
        Console.Write(charAry[i]);
    }

    Console.WriteLine();
}
Console.ReadLine();

沒有留言:

張貼留言