Другие языки программирования и технологии

Найти сумму квадратов всех чисел от 1 до n .

Паскаль. Найти сумму квадратов всех чисел от 1 до n . Нужно три способа через while ,repeat,for
Я бы так сделала (FreePascal, 1≤n≤3000000):
 uses crt; 
var m, n: longint;
s: int64;
begin
clrscr();
while true do
begin
write('n: ');
readln(n);
writeln('Σ(k=1;n)k² = ',
n * (n + 1) * (2 * n + 1) div 6);
if n < 1 then break;
s := 0;
m := 0;
while m < n do
begin
m := m + 1;
s := s + m * m;
end;
writeln('With While: ', s);
s := 0;
m := 0;
repeat
m := m + 1;
s := s + m * m
until m = n;
writeln('With Repeat: ', s);
s := 0;
for m := 1 to n do s := s + m * m;
writeln('With For: ', s);
writeln()
end;
end.
Счёт по формуле (только, естественно, не с идиотским /6 , а с нормальным div 6 - в первом случае получается вещественное число типа real, которым, например, девятнадцатизначные натуральные числа точно не выразить, а вещественный тип extended может ведь при таких операциях и не поддерживаться - тут всё зависит от диалекта Паскаля с конкретной системой программирования в придачу) и тремя циклами. А вот что у нас получается:Как видно, формула для суммы квадратов на восьмибайтных знаковых целых числах типа int64 перестаёт корректно работать при n=1664511, а со всеми тремя циклами всё работает корректно и до трёх с небольшим миллионов - это потому что при двойном умножении n•(n+1)•(2n+1) для, например, n=2000000 получается слишком большое для типа int64 число. В Pascal ABC.NET есть специальный тип "больших целых", для которого такой проблемы вообще не возникает, так что всё таки циклы тут не нужны и учебные цели задания их использование тоже никак не оправдывают...
Владимир Лазаренко
Владимир Лазаренко
66 572
Лучший ответ
=n*(n+1)*(2*n+1)/6

И не нужны никакие циклы!

http://dev.mccme.ru/~merzon/pscache/bernoulli-elem-pre.html
Aleh
Aleh
59 011
Николай Рябов он циклы проходит... а не математику сдаёт...

Похожие вопросы