使用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 釋出。