Разность в различных системах счисления

Ответить
nata4k@
Сообщения: 5
Зарегистрирован: 04 июн 2013, 15:45

Люди, помогите написать программу в паскале, которая вычисляет разность двух чисел в различных системах счисления. Очень нужно!!!Вот есть задача, но она не для всех чисел работает(

Код: Выделить всё

program Vichitanie_Chisel;
var
    num1, num2 : string;
    base : integer;
    res : string;
    iNum : integer;
    razn : integer;
    diffLenNum : integer;

function IntToHex (inNum : integer) : char;
const
    alpha = '0123456789ABCDEF';
begin
    Result := alpha [inNum + 1];
end;

function HexToInt (inNum : char) : integer;
const
    alpha = '0123456789ABCDEF';
begin
    case UpperCase(inNum) of
        '0'..'9': Result := Ord(inNum) - Ord('0');
        'A'..'Z': Result := Ord(inNum) - Ord('A') + 10;
    end;
end;



begin
    writeln('> Программа разности двух чисел <');
    
    write('Введите первое число: ');
    readln(num1);    
    
    write('Введите второе число: ');
    readln(num2);    
    
    write('Введите основание системы счисления: ');
    readln(base);
    
    if ( 
        ( pos ('.', num1) <> 0 ) or 
        ( pos (',', num1) <> 0 ) or 
        ( pos ('.', num2) <> 0 ) or
        ( pos (',', num2) <> 0 )
       ) 
     then begin
        writeln ('Программа предназначена для целых чисел!');
        exit;  
     end;
     
    // Дополнение нулями слева до длины самого длинного числа
    // (плюс один ноль для старшего разряда)
    // Например, числа 922 и 99 будут выглядеть как 0922 и 0099.
    // Чтобы разряд первого числа был рядом с разрядом второго.
    diffLenNum := abs( length(num1) - length(num2) );

    if ( length(num1) > length(num2) ) then begin
        num1 := StringOfChar('0', 1) + num1;
        num2 := StringOfChar('0', diffLenNum + 1) + num2;
    end
    else begin
        num1 := StringOfChar('0', diffLenNum + 1) + num1;
        num2 := StringOfChar('0', 1) + num2;
    end;
        
    // Подсказка для вещественных чисел: дополнять нулями справа
    // Например, 922.22 и 99 должны выглядеть как 0922.22 и 0099.00
    // В этом случае должна быть ещё дополнительная проверка на разделительный
    // знак.
    
    
    for iNum := length(num1) downto 1 do begin
    
       razn := HexToInt(num1[iNum]) - HexToInt(num2[iNum]);
        
        if ( razn >= base ) then begin
            num1[iNum - 1] := IntToHex( HexToInt(num1[iNum - 1]) + 1 );
            Dec(razn, base);
        end;            
        
        res := IntToHex( razn ) + res;
    end;    
    
    if (res[1] = '0') then delete(res, 1, 1);
    
    writeln(res);
 
end.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Как все запущено)) Правила арифметики применимы для чисел любых систем счисления. Поэтому достаточно описать только функции преобразования, вида:

function NumToInt(num:String; base:Integer):Longint;
function IntToNum(int:Longint; base:Integer):String;

Эти алгоритмы можно найти практически везде, а затем просто посчитать и показать разность, например:

Writeln(IntToNum(NumToInt(N1, Base) - NumToInt(N2, Base), Base));
It's a long way to the top if you wanna rock'n'roll
Ответить