使用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++还是有差距的。

本文版权遵循 CC BY-NC-SA 4.0发布,转载需附带本文链接。

当前页阅读量为: