【发布时间】:2015-10-23 20:59:56
【问题描述】:
这是我拥有的代码,但它很慢,任何方法都可以更快地做到这一点.. 我打的数字范围是 123456789,但我不能低于 15 秒,我需要它低于 5 秒..
long num = 0;
for (long i = 0; i <= n; i++)
{
num = num + GetSumOfDigits(i);
}
static long GetSumOfDigits(long n)
{
long num2 = 0;
long num3 = n;
long r = 0;
while (num3 != 0)
{
r = num3 % 10;
num3 = num3 / 10;
num2 = num2 + r;
}
return num2;
}
sum =(n(n+1))/2 没有给我我需要的结果,没有正确计算..
对于 N = 12,总和为 1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)= 51。 我需要用公式而不是循环来做到这一点..
我有大约 15 个测试要在每个 6 秒内完成..
并行我得到了一个从 15 秒到 4-8 秒的测试..
只是为了向你展示我正在做的测试,这是最难的..
[Test]
public void When123456789_Then4366712385()
{
Assert.AreEqual(4366712385, TwistedSum.Solution(123456789));
}
在我的电脑上,我可以在 5 秒内运行所有测试.. 看照片。。
DineMartine 回答我得到了这些结果:
【问题讨论】:
-
你需要输出为 1+2+3+4+...+9 吗?
-
for 循环的意义何在? GetSumOfDigits 将给出数字中所有数字的总和 .. 不需要 for 循环 ...
-
如果你想要 1 到 n 的总和,那么你可以使用公式
sum =(n(n+1))/2 -
喜欢 1+...+9 + (1 + 0)
-
1.每个大于 10 的数字一次又一次地排在第一位。尽可能地尝试乘法。 2. 使用数学公式。总和(1,..,9)=45。这可以用很多。 3. 如果您确实需要一些数字 - 没有数学/乘法,请使用基数(10、100 等)并遍历所有具有相同基数的数字,直到达到极限。这将节省大量
%操作。
标签: c# algorithm optimization