String25. Дана строка, изображающая десятичную запись целого положительного числа. Вывести строку, изображающую двоичную запись этого же числа.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
program String5; var i:integer; S,Srez:string; rez,Num:real; mem:byte; Procedure div2(var s:string; var mem:byte); //Деление на 2 числового значения записанного в строке. Вывод строка делёная на 2 и остаток от деления. var i:integer; s2:string; begin mem:=0; S2:=S; for i:=1 to length(s) do begin s2[i]:= chr((((ord(s[i])-48)+10*mem) div 2)+48); if ((ord(s[i])-48) mod 2) = 1 then mem:=1 else mem:=0; end; if s2[1]='0' then delete(s2,1,1); s:=s2; end; begin Write('S:'); Readln (S); Srez:=''; while (s<>'') do //делю на 2 остаток от деления запсываю в строку. begin div2(S,mem); Srez:=Srez+chr(mem+48); end; //разворачиваю строку for i:=1 to Length(Srez) do S:=S+Srez[Length(Srez)-i+1]; Writeln(S); end. |
Другие задачи из раздела String можно посмотреть здесь.
Еще один вариант — формально рабочий, но не самый красивый.
<pre>
program String25;
var
LineDec, LineBin : string;
Counter, Error : byte;
Decimal : integer;
begin
repeat
write(‘Enter an integer: ‘);
readln(LineDec);
Val(LineDec, Decimal, Error);
until (Error = 0);
LineBin := »;
while Decimal > 0 do
begin
LineBin := LineBin + chr((Decimal mod 2) + 48);
Decimal := Decimal div 2;
end;
for Counter := Length(LineBin) downto 1 do
write(LineBin[Counter]);
writeln;
end.
</pre>
Мне не нравиться решение. Из за операции Val(LineDec, Decimal, Error);, на условие «строка, изображающая десятичную запись целого положительного числа.» Накладывается очень сильные ограничения по длине строки. Упирающиеся в диапазон типа integer. Что я считаю не правильно.
Таким же образом можно было бы конвертировать строку в тип boolean и выводить 1 года true, и 0 когда false.
Дана строка, изображающая десятичную запись целого положительного числа. Вывести строку, изображающую двоичную запись этого же числа.
Можно ли на языке java