Дано натуральное число N. Вычислить разницу между самой большой и самой маленькой цифрой...

0 голосов

Дано натуральное число N. Вычислить разницу между самой большой и самой маленькой цифрой в записи этого числа.


спросил от (32 баллов) в категории Информатика
2 Ответы
0 голосов
ответил от Архангел (142k баллов)
 
Лучший ответ

// PascalABC.NET 3.1, сборка 1267 от 10.07.2016
begin
  var s:=ReadlnString('Натуральное число:').Distinct;
  Writeln('Макcимальная разница в цифрах: ',Integer(s.Max)-Integer(s.Min))
end.

Тестовое решение
Натуральное число: 3456634642452343053000523424136240235341
Макcимальная разница в цифрах: 6

оставил комментарий от Доцент (53.1k баллов)

begin
var digits := ReadInteger('n =').ToString().ToCharArray()
.Where(c -> c.IsDigit())
.Select(c -> StrToInt(c.ToString()));
// PrintLn(digits);
WriteLn(digits.Max - digits.Min);
end.

оставил комментарий от Архангел (142k баллов)

Что-то мне подсказывает, что Ваше решение сложнее и длиннее. И ограничено числами в 16.1 млн.

оставил комментарий от Доцент (53.1k баллов)

а ваше решение вообще никак не работает со случайными ошибками)

оставил комментарий от Архангел (142k баллов)

Напоминаю одно из базовых правил Сервиса: задание не должно тестировать входные данные, если это не оговорено условиями задания.

оставил комментарий от Архангел (142k баллов)

Кстати, это же правило действует в заданиях олимпиад, ЕГЭ, ГИА.

оставил комментарий от Доцент (53.1k баллов)

это даже правило... буду знать

оставил комментарий от Архангел (142k баллов)

Да, чтобы не превращать программы в монстров поверками типов, диапазонов и т.д.

оставил комментарий от Архангел (142k баллов)

Представляете, сказано, что нужно найти корень уравнения на отрезке a,b, указано, что [a;b] - интервал изоляции корня, а мы начинаем требовать от автора решения проверки, так ли это?

оставил комментарий от Доцент (53.1k баллов)

жалко не поделиться, раз уже решила

0 голосов
ответил от Одаренный (1.5k баллов)

Var n,ni,ma,mi,i:int64;
    nstr:string;
begin
ma:=0;
mi:=10;
read(n);
nstr:=inttostr(n);
for i:=1 to length(nstr) do begin
   ni:=strtoint(nstr[i]);
   if ni>ma then ma:=ni;
   if ni   end;
writeln(ma-mi);
end.

оставил комментарий от Архангел (142k баллов)

Неправда Ваша. Только что вбил Ваш код с заменой на max/min в PascalABC.NET 3.1, сборка 1267 от 10.07.2016 - компиляция идет без ошибок

оставил комментарий от Доцент (53.1k баллов)

это классическое решение данной задачи

оставил комментарий от Доцент (53.1k баллов)

var
n: longint;
t, max, min: byte;

begin
readln(n);
max := n mod 10;
min := max;

while n > 0 do
begin
t := n mod 10;
if t > max then max := t;
if t < min then min := t;
n := n div 10;
end;

writeln(max - min);
end.

оставил комментарий от Архангел (142k баллов)

Это язык какой? Free Pascal?

оставил комментарий от Одаренный (1.5k баллов)

Нельзя писать max и min. Ругается))) Думает, это функция

оставил комментарий от Доцент (53.1k баллов)

ma вместо max, mi вместо min. И вообще такие задачи класически через mod и div делаются

оставил комментарий от Одаренный (1.5k баллов)

PascalABC NET

оставил комментарий от Доцент (53.1k баллов)

если нет конечно повышенных требований на длину числа

оставил комментарий от Одаренный (1.5k баллов)

Ну и ладно. Возможно, я ошибся. Просто на другой версии Паскаля, на которой раньше я учился, частенько выскакивала такая ошибка, при каких то других действиях. Я уже подпривык ставить так

оставил комментарий от Архангел (142k баллов)

ABC.NET даже на кириллице идентификаторы позволяет писать, а еще есть экранирующий символ для имен, совпадающих с зарезервированными словами)))

...