Информатика в школе


Видео курсы для чайников фотошоп, joomla, wordpress, php, css 
  Главная  ●  Карта сайта
 
 

Задача "Сумма чисел"

[назад]

Задано натуральное число n. Найти сумму чисел от 1 до n включительно.

Вход. Натуральное число n, не большее 10000.

Выход. Сумма чисел от 1 до n включительно.

Пример входа

 3

Пример выхода

6

Решение. Элементарные вычисления.

Сумму чисел можно найти в цикле, последовательно складывая числа от 1 до n. Но такая реализация не оптимальна по времени. На реальном соревновании за такое решение получим Time Limit. Следует воспользоваться формулой суммы арифметической прогрессии. Результатом будет

res = (1 + n) * n / 2

Для целочисленных операций в Паскале над большими числами можно использовать вещественный тип . А результат выводить без знаков после запятой. По условию  максимальное n равно 10000, значит результат равен (1+10000)*10000 / 2 = 50005000, а он не помещается в тип integer.

  Реализация алгоритма

Читаем входное значение n и вычисляем сумму res согласно приведенной выше формуле. Аккуратно следует обращаться с преобразованием типов. Писать res := n*(n-1)/2.0 нельзя, так как в этом случае числа n и n-1 имеют тип integer, и при их произведении произойдет переполнение, что приведет к неверному результату.

 

program summa;

var

  n:integer;

  res:double;

begin

  readln(n);

  res := n;

  res := res*(n+1)/2.0;

  writeln(res:0:0);

end.

 

Ожидаемые ошибки

1. При использовании целочисленных типов в Паскале (integer  или word) невозможно вычислить результат, так как произойдет переполнение. Один из вариантов решения проблемы – использование действительного типа.

2. Действительным типом может быть real, double или extended. Предпочтительней использовать double, так как он 8 байтный – хорошо подходит для выполнения на сопроцессоре. 4 байтный тип real все равно преобразуется в 8 байтный, если у Вас в компьютере есть сопроцессор. Использование double увеличивает точность вычислений, сводя к минимуму ошибки вычислений при округлениях.

3. Сумму следует считать при помощи формулы суммы арифметической прогрессии. Все вычисления следует производить оптимально. То есть можно было бы написать следующую правильную циклическую программу, но она была бы не оптимальна по времени:

 

program summa;

var

  i,n:integer;

  res:double;

begin

  readln(n); res := 0;

  for i:=1 to n do

    res := res + i;

  writeln(res:0:0);

end.

 [назад]

 

Книжные новинки
Как сделать свой сайт и заработать на нем Е. Мухутдинов
Копилка
Рабочие программы
Проекты MS Office
Презентации
Открытые уроки
Экзаменационные билеты
Элективные курсы
Бесплатный soft
 Инструкции по ТБ
Подготовка к олимпиадам по информатике
Методика подготовки
"Золотые" алгоритмы
Простые задачи для начинающих
Олимпиадные задачи с решениями
Книги
Среда программирования
Обучение программированию на С++
Справочник по языку Pascal
Обучение
Подготовка к ЕГЭ
Создание сайтов
Уроки FrontPage
Уроки Word 2003
Создание игр на Delphi
Печатаем вслепую

Информация

Наши интервью
Книга почета
Курсы повышения квалификации
Электронная библиотечка
Книжная полка
Статьи
Полезные ссылки
Обратная связь

Конкурсы

Олимпиада
Фотоконкурс
VIP
Персональный раздел профессора
Макаровой Н.В.
Персональный раздел профессора
Смыковской Т.К.