Program uva;
begin
write(1000/((50*50*40)/1000000)/2.5, "лимонов и "1000/((50*50*40)/1000000)/2.5*1.5 " апельсинов" );
//50*50*40 ищется объём одной коробки, /1000000 переводится в метры,
//1000/((50*50*40)/1000000) ищется количество коробок. нам нужно засунуть в // коробки как можно больше лимонов, т.к. они дороже. но их максимальное
//количество соотносится с апельсинами как 1:1,5. Всего частей 1+1,5=2,5
//лимоны отсюда одна часть, значит делим все коробки на количество
//частей и получаем количество лимонов. а количество апельсинов просто
//умножаем количество лимонов на 1,5
end.
Судя по программе алгоритм линейный
Упрощения выражений показаны в прилагаемом файле.
Преобразуем выражение
Первые 2 слагаемых при переводе в с. сч. 3 дадут числа вида "10000...00", и количество нулей будет равно величине степени. (Можешь сам у в этом убедиться для чисел с небольшой степенью). Поэтому первые два слагаемых переведутся в число "100...0010000...00", кол-во нулей между единицами равно 66-45 = 21, правее средней единицы = 44.
Число
гораздо меньше. Поэтому при вычитании мы будем занимать разряд до тех пор, пока не дойдем до средней единицы, которая станет после этого 0, а все, что правее - двойками (было "100..00
100..00", стало "100..00
022..22", но только после заёма единицы, ещё нужно довычистывать). Затем проведем вычитание и посмотрим, сколько двоек пришлось убрать для этого.
Переводим
.
Вычитаем "100..00
100..0000" - 110 = "100..00
022..2
120"
Кол-во двоек между маркерованными цифрами = 44 - 3 = 41. Добавим ещё одну 2 правее маркерованной единицы = 42 -
ответ
<em>// PascalABC.NET 3.2, сборка 1383 от 09.02.2017</em>
<em>// Внимание! Если программа не работает, обновите версию!</em>
begin
var s:=ReadlnString;
if s.MatchValue('[0-7]*')=s then Writeln('YES')
else Writeln('NO')
end.