На главную Самоучитель pascal Форум программистов онлайн Решение задач pascal Задачи pascal Поиск
07 Июн 13

Сумма целых чисел от 1 до N


Комментарии :  1        Просмотры :  22981


Условие задачи :

Требуется посчитать сумму целых чисел от 1 до N.

Довольно простая задача хоть и с подвохом и если вы знаете как её решить , то вам следует пропустить её.
Но если же вы ещё новичек в программировании и у вас возникают проблемы при решении , то вам следует рассмотреть разбор задачи.

Устный разбор :

Вначале программы вводить значение переменной n. Например 4 . После этого создаем цикл , в котором посчитаем сумму всех чисел от 1 до N.

Первое решение задачи :

Код
program mypascal;
var
n,s,i:integer;
begin

  readln(n);
   
  s:= 0;
   
  for i:= 1 to n do
  s:= s + i;
   
  writeln(s);

end.


Для решения данной задачи нам потребовались 3 переменные . Переменная "N" для хранения заданного числа N , переменная "s" для хранения суммы всех чисел от 1 до N и переменная "i" в качестве счетчика для цикла.

Вначале программы вводим значение переменной N . Например 5 .Далее цикл перечисляет все цифры от 1 до N , в нашем случае это 1 , 2 , 3 , 4 , 5. И все эти цифры складывает друг с другом занося значение в переменную "s".

Но задача имеет свой подвох , так как при больших значениях N цикл будет занимать очень много времени. Есть простой способ решения этой проблемы.

Второе решение задачи :

Код
program mypascal;
var
n:integer;
begin

  readln(n);
   
  writeln(( 1 + n ) / 2 * n);

end.

В данной программе мы не используем цикл , что во много раз ускоряет работу нашей программы . Сам цикл мы заменяем арифметической прогрессией (формулой)
арифметическая прогрессия

Очень короткий код. Нам понадобилась всего одна переменная N .Но и это решение не идеально , так как значение переменной N может быть отрицательным.

Третье решение :

Код
program mypascal;
var
n:integer;
s:real;
begin

  readln(n);
   
  if ( n < 0) then
  s:= ((1+abs(n))*abs(n)/ 2 - 1) * -1
  else
  s:= (1+n)*n/ 2;

  if ( n = 0 ) then
  s:= 1;
   
  writeln(trunc(s));

end.

Самое гибкое решение . Подойдет для любого случая. Отлично работает при больших значениях N , при отрицательных значениях N. Если условие вывести целое число.

Объявляются две переменные "N" и "s". Переменная N несет в себе значение числа n , которое задают с клавиатуры. Переменная S несет в себе сумму чисел от 1 до N.

1. Вводим значение N.
2. Если значение N отрицательное , то s = ((1+abs(n))*abs(n)/ 2 - 1) * -1. Иначе s = (1+n)*n/ 2.
3. Подстраховываемся на тот случай , когда N = 0 и присваиваем s значение 1. Так как сумма чисел от 1 до 0 равна 1.
4. Выводим переменную s через функцию trunc() ( Подробнее ) специально для того случая , когда в условии задачи написано вывести целое число , а наша переменная s имеет вещественный тип.
Рейтинг материала : ( 4 / 7 )
Сообщить об ошибке
Комментарии :  1        Просмотры :  22981
Илья
16 Янв 14   18:33
спасибо за решение задачи!!! неплохо было бы ещё и блоксхему написать!!!
0  

Поиск

Решение задач

Если вас интересует решение какой-либо задачи , то вы можете опубликовать
её условие на нашем сайте или форуме. И в скором времени другие пользователи помогут вам.

Опубликовать на сайте

Опубликовать на форуме

Опрос

Какую разновидность паскаля вы предпочитаете ?