第一题:连续正整数(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#代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | 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++还是有差距的。
[原创 2007-08-24 10:37:43]