В случае с усложнённым заданием теперь программа не только будет ПРОСИТЬ пользователя ВВЕСТИ ЧИСЛО ДЛЯ ВОЗВЕДЕНИЯ В СТЕПЕНЬ и саму степень... Программа будет должна осуществлять дополнительную проверку на то больше результат по модулю, чем число 2147483647 или нет, если да, то предупреждать об этом пользователя («Опасность! Результат больше чем … »)Комментарий по ходу выполнения программы давать вразумительный и обязательный.
Пример работы программы такой:
На экране появляется фраза типа
«Введите целое число»
Введите его степень»
Юзер вводит два целых числа (пускай 5 и 30)
Программа сообщает:
«Внимание! Результат 5^30 выходит за пределы типа INTEGER, 2147483647!!! Тем не менее, Ваш результат равен ….»
Или если всё в порядке, то программа сообщит пользователю: «Всё ОК. Результат: …»
Ответы
Ответ дал:
0
//PascalABC.NET
//Версия 3.3, сборка 1634 (14.02.2018)
begin
var (n,i):=ReadInteger2('Введите целое число и его степень->');
If n**i>Integer.MaxValue
then WritelnFormat('Внимание! Результат {0}^{1} выходит за пределы типа INTEGER, 2147483647!!! Тем не менее, Ваш результат равен {2}',n,i,biginteger(n**i))
else Println('Всё ОК. Результат:',n**i);
end.
//Версия 3.3, сборка 1634 (14.02.2018)
begin
var (n,i):=ReadInteger2('Введите целое число и его степень->');
If n**i>Integer.MaxValue
then WritelnFormat('Внимание! Результат {0}^{1} выходит за пределы типа INTEGER, 2147483647!!! Тем не менее, Ваш результат равен {2}',n,i,biginteger(n**i))
else Println('Всё ОК. Результат:',n**i);
end.
Ответ дал:
0
В чем разница?
Ответ дал:
0
Результат всеравно biginteger, нет?
Ответ дал:
0
Разница в том, что обычно тип результата операции х для "A x B" выбирается по типу того из операндов, который имеет бОльшую разрядность. Если Вы используете операцию вида < integer > x < integer > то ее результат будет тоже integer. Вас немного спасло (но не надолго) то, что A**B - это не обычная операция, а синоним некоторой функции, которая в своей внутренней реализации для некоторого количества умножений сама использует преобразование к BigInteger.
Ответ дал:
0
Стоило это количество превысить - и получили стандартный вызов Power(A,B), которая рассчитывается через экспоненту от логарифма, т.е. работает с плавающей точкой. Можно проверить написанное выше обычным умножением.
Ответ дал:
0
begin
var k:=123456789;
Writeln(k*k);
Writeln(BigInteger(k*k));
Writeln(BigInteger(k)*k)
end.
var k:=123456789;
Writeln(k*k);
Writeln(BigInteger(k*k));
Writeln(BigInteger(k)*k)
end.
Ответ дал:
0
PascalABC.NET 3.3.5, сборка 1650 от 01.04.2018
Внимание! Если программа не работает, обновите версию!
begin
var (a,b):=ReadInteger2('Введите целые основание и показатель степени:');
var bigA:=BigInteger(a);
var r:=bigA**b;
if r>integer.MaxValue then begin
Write($'Внимание! Результат {a}^{b} выходит за пределы типа INTEGER, ');
Writeln(integer.MaxValue, '!!!');
Writeln('Тем не менее, Ваш результат равен ',r)
end
else
Writeln($'Все ОК. Результат {a}^{b}={r}')
end.
Примеры
Введите целые основание и показатель степени: 12 6
Все ОК. Результат 12^6=2985984
Введите целые основание и показатель степени: 5 30
Внимание! Результат 5^30 выходит за пределы типа INTEGER, 2147483647!!!
Тем не менее, Ваш результат равен 931322574615478515625
Внимание! Если программа не работает, обновите версию!
begin
var (a,b):=ReadInteger2('Введите целые основание и показатель степени:');
var bigA:=BigInteger(a);
var r:=bigA**b;
if r>integer.MaxValue then begin
Write($'Внимание! Результат {a}^{b} выходит за пределы типа INTEGER, ');
Writeln(integer.MaxValue, '!!!');
Writeln('Тем не менее, Ваш результат равен ',r)
end
else
Writeln($'Все ОК. Результат {a}^{b}={r}')
end.
Примеры
Введите целые основание и показатель степени: 12 6
Все ОК. Результат 12^6=2985984
Введите целые основание и показатель степени: 5 30
Внимание! Результат 5^30 выходит за пределы типа INTEGER, 2147483647!!!
Тем не менее, Ваш результат равен 931322574615478515625
Похожие вопросы
2 года назад
2 года назад
2 года назад
2 года назад
8 лет назад
8 лет назад
9 лет назад