Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 08.11.2011, 23:29   #1
sqr
Пользователь
 
Аватар для sqr
 
Регистрация: 25.10.2011
Сообщений: 49
По умолчанию Циклы. Арифметическое переполнение.

Добрый вечер, единомышленники. Возникла такая ситуация, есть задачка:
"Вычислить произведение натуральных чисел на отрезке от a до b, кратных числу k"
Проблема в том что если указать большой диапазон например 1 - 100 и кратность к=2 то выскакивает ошибка 215. Арифметическое переполнение.
Если диапазон 1-10 к примеру, то все нормально (вроде)...
Я сомневаюсь в правильности выполнения. Проверьте пожалуйста.
Код:
program lab4;
uses crt;
var a,b,c,d,i,k:integer;
begin
     clrscr;
     {Вводим данные}
     write('Введите значение точки А: ');readln(a);
     write('Введите значение точки B: ');readln(b);
     write('Введите (кратность) k: ');readln(k);
     c:=1;
     {Считаем произведение кратных чисел диапазона}
     while a<=b do begin
           if (a mod k)=0 then
             c:=c*a;
             a:=a+1;
     end;
        {Вывод результата}
        writeln('Произведение чисел диапазона a..b кратных ',k,' = ',c);
     readln;
end.
Everybody lies.
sqr вне форума Ответить с цитированием
Старый 08.11.2011, 23:33   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Тип integer в досовом паскале имеет размер 16 бит, соответсвенно, самое большое положительное число, которое можно в него записать = 32767.

> например 1 - 100 и кратность к=2

Вы, надеюсь, догадываетесь, хоть примерно, сколько будет нулей у произведения всех этих чисел?
Тут вас Real только спасёт, ну или длинная арифметика.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 08.11.2011 в 23:38.
veniside вне форума Ответить с цитированием
Старый 08.11.2011, 23:39   #3
sqr
Пользователь
 
Аватар для sqr
 
Регистрация: 25.10.2011
Сообщений: 49
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Тип integer в досовом паскале имеет размер 16 бит, соответсвенно, самое большое положительное число, которое можно в него записать = 32767.

> например 1 - 100 и кратность к=2

Вы, надеюсь, догадываетесь, хоть примерно, сколько будет нулей у произведения всех этих чисел?
Тут вас Real только спасёт, ну или длинная арифметика.
Ну а сама задачка то правильно решена? Просто в условии сказано "натуральных чисел" поэтому использовал integer
Everybody lies.
sqr вне форума Ответить с цитированием
Старый 08.11.2011, 23:53   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

ну, более-менее вроде правильно, на первый взгляд. Только не мешало бы k на равенство 0 проверить.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.11.2011, 00:04   #5
sqr
Пользователь
 
Аватар для sqr
 
Регистрация: 25.10.2011
Сообщений: 49
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
ну, более-менее вроде правильно, на первый взгляд. Только не мешало бы k на равенство 0 проверить.
Ну это не столь важно
Главное чтобы условие задачи чётко выполнилось
Everybody lies.
sqr вне форума Ответить с цитированием
Старый 09.11.2011, 00:18   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

если чисел, кратных k нет, ваша программа спокойно выведет, что их произведение якобы равно 1.

если k = 0, ваша программа вобще не сможет разумно завершиться.

не говоря уже о переполнении при первой же возможности.

Я бы не назвал это "чётким выполнением условия задачи"
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 09.11.2011 в 00:21.
veniside вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переполнение буфера Dimarik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.07.2011 01:24
Арифметическое переполнение hasana Помощь студентам 2 04.11.2010 18:08
Переполнение деления!!! zero-cool Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 28.09.2010 20:10
Переполнение стека Ake Паскаль, Turbo Pascal, PascalABC.NET 3 30.05.2009 21:39
Переполнение Стека Викдон Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 19:16


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS