Function aToDec(n:string;k:integer):longint; { Перевод из системы по основанию k в десятичную } var i:integer; pa,s:longint; begin s:=0; pa:=1; for i:=Length(n) downto 1 do begin s:=s+pa*(Ord(n[i])-Ord('0')); pa:=pa*k end; aToDec:=s end;
function DecToa(n:longint;k:integer):string; { Перевод из десятичной системы в систему по основанию k } var s:string; c:integer; begin s:=''; c:=Ord('0'); while n>0 do begin s:=Chr(c+n mod k)+s; n:=n div k end; DecToa:=s end;
function AtoB(s:string;A,B:integer):string; { Перевод из системы по основанию A в систему по основанию B } begin AtoB:=DecToa(aToDec(s,A),B) end;
var a,b:integer; n:string; begin Write('Число в c/c по основанию [2;10]: '); Readln(n); Writeln('Укажите исходное и результирующее основания: '); Read(a,b); Writeln(n,'(',a,') = ',AtoB(n,a,b),'(',b,')'); end.
Пример решения Число в c/c по основанию [2;10]: 643342414 Укажите исходное и результирующее основания: 7 9 643342414(7) = 80050347(9)
{ Перевод из системы по основанию k в десятичную }
var
i:integer;
pa,s:longint;
begin
s:=0;
pa:=1;
for i:=Length(n) downto 1 do begin
s:=s+pa*(Ord(n[i])-Ord('0'));
pa:=pa*k
end;
aToDec:=s
end;
function DecToa(n:longint;k:integer):string;
{ Перевод из десятичной системы в систему по основанию k }
var
s:string;
c:integer;
begin
s:='';
c:=Ord('0');
while n>0 do begin
s:=Chr(c+n mod k)+s;
n:=n div k
end;
DecToa:=s
end;
function AtoB(s:string;A,B:integer):string;
{ Перевод из системы по основанию A в систему по основанию B }
begin
AtoB:=DecToa(aToDec(s,A),B)
end;
var
a,b:integer;
n:string;
begin
Write('Число в c/c по основанию [2;10]: '); Readln(n);
Writeln('Укажите исходное и результирующее основания: ');
Read(a,b);
Writeln(n,'(',a,') = ',AtoB(n,a,b),'(',b,')');
end.
Пример решения
Число в c/c по основанию [2;10]: 643342414
Укажите исходное и результирующее основания:
7 9
643342414(7) = 80050347(9)
Приведём все степени к основанию 2
2^3702-2^468+2^1620-108
-108 можно представить как -128 + 16 + 4
2^3702-2^468+2^1620-2^7 + 2^4 + 2^2
Теперь выстраиваем степени в порядке убывания:
2^3702+2^1620-2^468-2^7 + 2^4 + 2^2
В выражении два вычитания подряд, избавимся от этого, заменив -2^468 на -2^469 + 2^468
2^3702+2^1620 -2^469+2^468-2^7 + 2^4 + 2^2
2^3702 - 1 единица
2^4 - 1 единица
2^2 - 1 единица
Количество единиц в вычитаниях будет равно разнице степеней. Например 1000000-100=1111
2^1620 -2^469 - количеств единиц 1620-469 = 1151
2^468-2^7 - количество единиц 468-7 = 461
Общее количество единиц равно 3+1151+461 = 1615