begin s:=1; readln(a, b, c); if (a<=0) AND (b<=0) AND (c<=0) then writeln('Среди чисел a, b, c нет положительных чисел') else begin if a>0 then s:=s*a; if b>0 then s:=s*b; if c>0 then s:=s*c; writeln(s); end; end.
Рассмотрим сложение в младшем разряде. В десятичной системе счисления 2+5=7, а у нас записан ноль. Следовательно, данный разряд был сброшен, а в следующий добавлена единица. Такое возможно только если сумма (т.е. 7) равна основанию системы счисления, в которой производится сложение. Т.е. мы делаем предположение, что система семиричная. В самом деле, когда мы складываем два однозначных десятичных числа, например 2 и 8, то получаем 10, 0 в разряде сложения и перенос 1 в следующий разряд. В двоичной система 1+1=10, т. е. тут двойка (1+1) - основание системы - привела к появлению нуля и переносу. Проверим предположение, что система семиричная. В следующем разряде снова 2+5=7, но еще есть разряд переноса, итого 8. Но 8 в семиричной системе записывается как 11. Итого получается как раз 110, т.е. система счисления действительно семиричная.
В задаче имеется "топорное решение" — посчитать напрямую. Получившееся число будет восьмизначным, что не так уж и страшно, если в голову не приходят другие решения.
Рассмотрим, однако, решение, которое позволит делать подобные задачи без прямого подсчёта. Для этого, прежде всего, переведём всё в степени тройки:
Как представляется число 3n в троичной системе счисления? Давайте подумаем, как мы переводим из десятичной системы в троичную? Сначала делим на 3, затем частное делим на 3, затем новое частное на 3 и т.п. Что получится в случае деления 3n на 3? Очевидно, что 3n-1. А если его поделить дальше на 3, то получится 3n-2. Если так сделать n раз, то в конце останется 30, то есть. Таким образом, это будет число 100..00, где количество нулей равно n.
То есть, например, 8-ая степени тройки в троичной системе представима в виде 1000000003. А 35 — это 1000003.
Вернёмся теперь к нашей сумме. Давайте сначала в столбик сложим 316 и 35 в троичной системе счисления.
Теперь остаётся из этого вычесть 32. Для этого придётся "занять" разряд. Но принцип тут такой же, как и в обычной, десятичной системе счисления, только 0 будут превращаться не в 9, а в 2 (самую большую цифру в троичной системе счисления:
a, b, c, s:integer;
begin
s:=1;
readln(a, b, c);
if (a<=0) AND (b<=0) AND (c<=0) then
writeln('Среди чисел a, b, c нет положительных чисел')
else
begin
if a>0 then
s:=s*a;
if b>0 then
s:=s*b;
if c>0 then
s:=s*c;
writeln(s);
end;
end.