使用C#嘗試編寫百度之星程序設計大賽的題目(一)

第一題:連續正整數(10分)

題目描述: 一個正整數有可能可以被表示為n(n>=2)個連續正整數之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8 請編寫程序,根據輸入的任何一個正整數,找出符合這種要求的所有連續正整數序列。

輸入數據:一個正整數,以命令行參數的形式提供給程序。

輸出數據:在標準輸出上打印出符合題目描述的全部正整數序列,每行一個序列,每個序列都從該序列的最小正整數開始、以從小到大的順序打印。如果結果有多個序列,按各序列的最小正整數的大小從小到大打印各序列。

此外,序列不允許重複,序列內的整數用一個空格分隔。如果沒有符合要求的序列,輸出「NONE」。 例如,對於15,其輸出結果是: 1 2 3 4 5 4 5 6 7 8 對於16,其輸出結果是: NONE 評分標準: 程序輸出結果是否正確。

原題:http://hi.baidu.com/astar/blog/item/69570fb35eedeba6d9335ab5.html (鏈接已失效)

我見到的C++優化最好的代碼的平均運行時間(若輸入10000000)為0.15秒。

我設計的優化C#代碼:

using System;
using System.Text;
namespace test
{
    public class test
    {
        static void Main()
        {
            bool has = false;
            Console.Write("Input Int:");
            int a;
            if (int.TryParse(Console.ReadLine(), out a) && a > 0)
            {
                int t = Environment.TickCount;
                int max = a / 2 + 1;
                int s = 0;
                StringBuilder str = new StringBuilder ();
                for (int i = 1; i < = max; i++)
                {
                    s = i;
                    for (int ii = i + 1; ii <= max; ii++)
                    {
                        s += ii;
                        if (s == a)
                        {
                            has = true;
                            for (int iii = i; iii <= ii; iii++)
                            {
                                str.Append(iii);
                                str.Append(" ");
                            }
                            str.Append(";rn");
                            break;
                        }
                        if (s > a)
                        {
                            break;
                        }
                    }
                }
                if (!has)
                {
                    Console.WriteLine("None");
                }
                t = Environment.TickCount - t;
                Console.WriteLine(str);
                Console.WriteLine("Time:{0:###.########}", (double)t/1000);
                GC.Collect();
                Main();
            }
            else
            {
                return;
            }
        }
    }
}

輸入10000000用時0.25秒。說明C#在數值計算上和C++還是有差距的。

当前页阅读量为: