Предположим, что я хочу получить сумму всех квадратов от M до N. Я немного искал Google и нашел эту формулу:
(1 ^ 2 + 2 ^ 2 + 3 ^ 2 +... + N ^ 2) = (N * (N + 1) * (2N + 1))/6
поэтому я пишу этот код:
static void Main(string[] args)
{
const int from = 10;
const int to = 50000;
Console.WriteLine(SumSquares(from, to));
Console.WriteLine(SumSquares2(from, to));
}
static long SumSquares(int m, int n)
{
checked
{
long x = m - 1;
long y = n;
return (((y*(y + 1)*(2*y + 1)) - (x*(x + 1)*(2*x + 1)))/6);
}
}
static long SumSquares2(int m, int n)
{
long sum = 0;
for (int i = m; i <= n; ++i)
{
sum += i * i;
}
return sum;
}
он работает нормально до 40k, но когда N становится 50k
, он терпит неудачу. Выход для 50k:
41667916674715
25948336371355
Press any key to continue . . .
Я думаю, что это переполнение или что-то еще, поэтому я добавил ключевое слово checked
и попытался изменить long
на double
, но получил тот же результат. Как это можно объяснить? Как получить правильный результат без циклов?