Александр Устименко
Просветленный
(24313)
7 лет назад
Многовато кода, но есть проверка основания (p < 17) и подсказка, что для данной системы счисления выбрано неверное основание "p"
var i, p, stepen, g, code_error: integer;
sum: real;
s, ss: string;
ch: char;
begin
ss:='0123456789ABCDEF';
p:=1;
repeat
write ('основание СС p=');
readln (p);
write ('строка s=');
readln (s);
until p < length (ss)+1;
stepen:=1;
sum:=0;
while length(s) > 0 do
begin
ch:=s[length(s)];
s:=copy (s, 1, length(s)-1);
val (ch, g, code_error);
for i:=1 to 16 do
if ch=ss[i] then g:=i-1;
if g >= p then
begin
write ('Основание системы выбрано неверно');
halt;
end;
sum:=sum+g*power(p, stepen-1);
//writeln (ch,' ':5,stepen-1,' ':4,g*power(p, stepen-1));
inc(stepen);
end;
writeln ('число в 10-й СС= ', sum)
end.
Зло
Просветленный
(38869)
7 лет назад
Для перевода числа из одной системы счисления в десятичную достаточно посчитать многочлен
сумма ( S[ i ] * pow( p, i ) )
где
S[ i ] - символ на и-той позиции
pow( p, i ) - основание системы счисления в степени i
в случае p > 10 не стоит забывать о том, что A = 10, B = 11 и т. д.
P.S. я позиции считаю от 0, а не от 1
Пример: перевести 1234 из 8-ной сс в десятичную:
x = 4 + 3*8 + 2*64 + 1*512 = 668
Пример: перевести A3B из 16-й в 10-ую:
x = 11 + 3*16 + 10*256 = 2619
Krab Bark
Искусственный Интеллект
(286471)
7 лет назад
program to10;
var s:string; i,o,p:integer; b,k:longInt;
begin
b:=0; k:=1; write('Base: '); readln(o); write('Number: '); readln(s);
for i:=length(a) downto 1 do
begin p:=ord(s[i])-48; p:=p-ord(p>48)*32-ord(p>9)*7; b:=b+k*p; k:=o*k end;
writeln(b); readln
end.