Имеются кувшин емкостью 8 л,заполненный квасом,и два пустых кувшина емкостью 3 л и 5 л.запиши алгоритм, выполняя который модно разделить квас поровну между двумя людьми(разрешается пользоваться только этими тремя кувшинами).
type //Тип, задающий основания систем счисления. TBase = 2..20;
//Переводит запись числа в системе счисления по основанию aBase - в число. function XToNum(const aStr : String; aBase : TBase) : Longint; var StrBin : String; i, Sign : Integer; Res, Weight : Longint; begin XToNum := 0; if aStr = '' then Exit;
Res := 0;
//Определяем знак и получаем запись числа без знака. if aStr[1] = '-' then begin Sign := -1; StrBin := Copy(aStr, 2, Length(aStr) - 1); end else begin Sign := 1; StrBin := aStr; end;
Weight := 1; //Движемся по разрядам беззнакового числа справа-налево. for i := Length(StrBin) downto 1 do begin case StrBin[i] of '0' : Res := Res + 0 * Weight; '1' : Res := Res + 1 * Weight; '2' : Res := Res + 2 * Weight; '3' : Res := Res + 3 * Weight; '4' : Res := Res + 4 * Weight; '5' : Res := Res + 5 * Weight; '6' : Res := Res + 6 * Weight; '7' : Res := Res + 7 * Weight; '8' : Res := Res + 8 * Weight; '9' : Res := Res + 9 * Weight; 'A', 'a' : Res := Res + 10 * Weight; 'B', 'b' : Res := Res + 11 * Weight; 'C', 'c' : Res := Res + 12 * Weight; 'D', 'd' : Res := Res + 13 * Weight; 'E', 'e' : Res := Res + 14 * Weight; 'F', 'f' : Res := Res + 15 * Weight; 'G', 'g' : Res := Res + 16 * Weight; 'H', 'h' : Res := Res + 17 * Weight; 'I', 'i' : Res := Res + 18 * Weight; 'J', 'j' : Res := Res + 19 * Weight; else raise Exception.Create('Ошибка! Незарегистрированная цифра!'); end; //Вес следующего разряда. Weight := Weight * aBase; end;
//Учитываем знак. XToNum := Sign * Res; end;
//Переводит число в систему счисления по основанию aBase. function NumToX(const aNum : Longint; const aBase : TBase) : String; var Num : Longint; Dig : Byte; Res : String; begin Res := ''; Num := Abs(aNum); repeat //Определяем очередной младший разряд числа. Dig := Num mod aBase; case Dig of 0 : Res := '0' + Res; 1 : Res := '1' + Res; 2 : Res := '2' + Res; 3 : Res := '3' + Res; 4 : Res := '4' + Res; 5 : Res := '5' + Res; 6 : Res := '6' + Res; 7 : Res := '7' + Res; 8 : Res := '8' + Res; 9 : Res := '9' + Res; 10 : Res := 'A' + Res; 11 : Res := 'B' + Res; 12 : Res := 'C' + Res; 13 : Res := 'D' + Res; 14 : Res := 'E' + Res; 15 : Res := 'F' + Res; 16 : Res := 'G' + Res; 17 : Res := 'H' + Res; 18 : Res := 'I' + Res; 19 : Res := 'J' + Res; end; //Удаляем из числа очередной младший разряд. Num := Num div aBase; until Num = 0;
//Учитываем знак. if aNum < 0 then Res := '-' + Res; NumToX := Res; end;
//Переводит число, представленное в системе счисления по основанию aBase1, //в систему счисления по основанию aBase2. function XToY(const aStr : String; const aBase1, aBase2 : TBase) : String; begin XToY := NumToX( XToNum(aStr, aBase1), aBase2 ); end;
var S : String; begin repeat Writeln('Задайте целое число в шестнадцатиричной системе счисления:'); Readln(S); S := XToY(S, 16, 20);
Writeln('Это же число, представленное в двадцатиричной системе счисления:'); Writeln(S);
Writeln('Повторить - Enter, выход - любой символ + Enter.'); Readln(S); until S <> ''; end.\n";
17
Объяснение:
1)2000 возможных значений => чтобы закодировать каждое значение нужно 11 би тк 2^i = 2000 = > i = 11 бит(примерно)
2)значений считываются по сериям из 50 =>на одну серию потребуется 50 * 11 = 550 бит = 550/8 = 69 байт
3)12312 = 12300+12 =246*50+12 те получается 246 серий и еще 12 значений
4)246 серия можно закодировать 69*246 = 16974
5)12 значений кодируются отдельно минимальным количеством байтов те 12 *11 = 132 бита = 132/8 = 17 байт
6)чтобы закодировать все значения нужно 17+16974 = 16991 байт
7)16991 байт = 16991 /1024 кб = 17 кб