Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2008, 17:35   #11
Wintrymoon
Пользователь
 
Аватар для Wintrymoon
 
Регистрация: 06.03.2008
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
№2. Опять же, насколько большим будет число в десятичной системе?
Ну вот к примеру FA16 из шеснадцатиричной системы в десятичную....числа не большеие.

Вот примерная прога:

Program RTA18;
var b:integer; {основание}
x:string; {число, вводимое с клавиатуры}
y:integer; {число, преобразованное по основанию 10}
i:integer;
bi:integer; {основание в степени i}
begin
write ('Введите основание b='); readln (b);
write ('Введите число, записанное по основанию ',b,': ');
readln (x);
y:=0;
bi:=1; {основание в степени 0};
for i:=length(x) downto 1 do
begin
y:=y+(ord(x[i])-48)*bi;
bi:=bi*b;
end;
writeln ('Число, записанное по основанию 10: ',y);
readln;
end.

Но она работает только если переводить числа, по основанию меньше 10. А если переводить с шеснадцатиричной системы в десятичную, то там уже идут буквы.....
Мечта - не бегство от действительности, а способ приблизится к ней!
Wintrymoon вне форума Ответить с цитированием
Старый 07.03.2008, 18:23   #12
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

№2
Код:
var
    Error   : integer;
    _base   : byte;
    Digit   : byte;
    i       : byte;
    Number  : string;
    Decimal : longint;

begin
    write('Number: '); readln(Number);
    write('Base: '); readln(_base);


    if( (_base < 2) or (_base > 16)) then begin
        Error := 1;
    end
    else begin
        Decimal := 0;
        for i := 1 to length(Number) do begin
            case Number[i] of
                'A'..'F': Digit := 10 + ord(Number[i]) - ord('A');
                'a'..'f': Digit := 10 + ord(Number[i]) - ord('a');
                '0'..'9': Digit := ord(Number[i]) - ord('0');
                else begin
                    Error := 2;
                    break;
                end;
            end;
            if Digit >= _Base then begin
                Error := 2;
                break;
            end;
            Decimal := Decimal * _Base + Digit;
        end;
    end;
    writeln;
    case error of
        0 : writeln('Decimal: ', Decimal);
        1 : writeln('Invalid Base');
        else writeln('Invalid String');
    end;
    readln;
end.

Последний раз редактировалось B_N; 07.03.2008 в 18:41.
B_N вне форума Ответить с цитированием
Старый 07.03.2008, 18:41   #13
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Cannibal Посмотреть сообщение
для сложения "больших" чисел есть тип Longint
Сложи мне 10000000000000000000000000000000000 000000 и 10000000000000000000000000000000000 000000, используя longint.

ЗЫ А система счисления может быть любой и боюсь букв там не хватит.
Carbon вне форума Ответить с цитированием
Старый 08.03.2008, 14:17   #14
Шаман
Пользователь
 
Регистрация: 01.03.2008
Сообщений: 25
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
А если x < 0 ?
Коль что-то знает, допишет сам(а).
Плюс 1
Шаман вне форума Ответить с цитированием
Старый 08.03.2008, 14:42   #15
Лёха
Пользователь
 
Регистрация: 17.12.2007
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Шаман Посмотреть сообщение
Коль что-то знает, допишет сам(а).
А у меня в любом случае x>0

Цитата:
Сообщение от B_N Посмотреть сообщение
№2
Почему то не всегда получается....Вот например число 328 девятиричной системы в десятичную не переводится, или вот число 516 семиричной системы тоже не переводится в десятичную....

я бы сделал, но я в паскале совершенно ничего не понимаю.

у миня с паскалем большие проблемы, я вот даж блок-схему немогу сделать.

Последний раз редактировалось Alex21; 16.03.2008 в 11:11. Причина: Объеденил сообщения
Лёха вне форума Ответить с цитированием
Старый 08.03.2008, 19:59   #16
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Есть ограничения по системе счисления?
Carbon вне форума Ответить с цитированием
Старый 08.03.2008, 20:13   #17
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Wintrymoon Посмотреть сообщение
Почему то не всегда получается....Вот например число 328 девятиричной системы в десятичную не переводится, или вот число 516 семиричной системы тоже не переводится в десятичную....
328|9 = 3*9*9 + 2*9 + 8 = 243 + 18 + 8 = 269|10
516|7 = 5*7*7 + 1*7 + 6 = 245 +7 + 6 = 258|10

В чём дело? Именно такие результаты мой вариант и даёт...
B_N вне форума Ответить с цитированием
Старый 08.03.2008, 20:24   #18
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Код:
const startLetter=ord('A');
      startNumber=ord('0');

var base,i,add:integer;
    num:string;
    result:Int64;
    error:boolean;

begin
    readln(base);
    readln(num);

    num:=UpperCase(num);
    result:=0;
    error:=false;

    for i:=Length(num) downto 1 do
        if not error then
        begin
            result:=result*base;
            if num[i] in ['0'..'9'] then
                add:=ord(num[i])-startNumber
            else
                add:=10+ord(num[i])-startLetter;
            error:=add>=base;
            if not error then
                inc(result,add)
        end;

    if error then
        writeln('Invalid number')
    else
        writeln(result);

    readln
end.

Последний раз редактировалось Carbon; 08.03.2008 в 20:28.
Carbon вне форума Ответить с цитированием
Старый 08.03.2008, 23:26   #19
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

№3
Код:
const start=ord('0');

var A,B,RESULT:string;
    minusA,minusB,error:boolean;
    i,lnA,lnB:integer;

function Add(A,B:string; lnA,lnB:integer):string;
var i,j,ost,num:integer;
    nA,nB:char;
    res:string;
begin
    res:='';
    ost:=0;

    i:=lnA;
    j:=lnB;
    while (i>=1) or (j>=1) do
    begin

        if i>=1 then
            nA:=A[i]
        else
            nA:='0';

        if j>=1 then
            nB:=B[j]
        else
            nB:='0';

        num:=ost+ord(nA)+ord(nB)-2*start;
        res:=chr(start+num mod 10)+res;
        ost:=num div 10;

        dec(i);
        dec(j)
    end;

    if ost<>0 then
        res:=chr(start+ost)+res;

    Add:=res
end;

function Sub(A,B:string; lnA,lnB:integer):string;
var i,j,ost,num:integer;
    nB:char;
    res:string;
    minus:boolean;
begin
    minus:=false;
    if (lnA<lnB) or (lnA=lnB) and (A<B) then
    begin
        res:=A;
        num:=lnA;
        A:=B;
        lnA:=lnB;
        B:=res;
        lnB:=num;
        minus:=true
    end;

    res:='';
    ost:=0;

    i:=lnA;
    j:=lnB;
    while i>=1 do
    begin

        if j>=1 then
            nB:=B[j]
        else
            nB:='0';

        num:=ost+ord(A[i])-ord(nB);
        if num<0 then
        begin
            inc(num,10);
            ost:=-1
        end
        else
            ost:=0;
        res:=chr(start+num mod 10)+res;

        dec(i);
        dec(j)
    end;

    res:=res+chr(0);
    i:=1;
    while res[i]='0' do
        inc(i);
    Delete(res,1,i-1);

    if Length(res)=1 then
        res:='0'+chr(0);

    if minus then
        res:='-'+res;

    Sub:=Copy(res,1,Length(res)-1);
end;

begin
    readln(A);
    readln(B);

    minusA:=A[1]='-';
    if minusA then
        Delete(A,1,1);
        
    minusB:=B[1]='-';
    if minusB then
        Delete(B,1,1);

    error:=(A[1]='-') or (B[1]='-');

    if not error then
    begin
        lnA:=Length(A);
        i:=1;
        while (i<=lnA) and not error do
        begin
            error:=not (A[i] in ['0'..'9']);
            inc(i,1)
        end;

        lnB:=Length(B);
        i:=1;
        while (i<=lnB) and not error do
        begin
            error:=not (B[i] in ['0'..'9']);
            inc(i,1)
        end;

        if not error then
        begin
            A:=A+chr(0);
            i:=1;
            while A[i]='0' do
                inc(i);
            Delete(A,1,i-1);
            dec(lnA,i-1);
            if lnA=0 then
            begin
                A:='0';
                lnA:=1
            end;

            B:=B+chr(0);
            i:=1;
            while B[i]='0' do
                inc(i);
            Delete(B,1,i-1);
            dec(lnB,i-1);
            if lnB=0 then
            begin
                B:='0';
                lnB:=1
            end;

            if minusA and minusB then
                if (A='0') and (B='0') then
                    RESULT:='0'
                else
                    RESULT:='-'+Add(A,B,lnA,lnB)
            else
                if not minusA and not minusB then
                    RESULT:=Add(A,B,lnA,lnB)
                else
                    if minusA and not minusB then
                        RESULT:=Sub(B,A,lnB,lnA)
                    else
                        RESULT:=Sub(A,B,lnA,lnB)
        end
    end;

    if error then
        writeln('Invalid number')
    else
        writeln(RESULT);

    readln
end.
Carbon вне форума Ответить с цитированием
Старый 08.03.2008, 23:37   #20
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

№1 Без плавающей точки и количество операций не зависит от степени.
Код:
var base,power,num,i:integer;
    result:Int64;

begin
    readln(base);
    readln(power);

    result:=1;
    num:=1 shl 31;

    for i:=1 to 32 do
    begin
        result:=result*result;
        if power and num=num then
            result:=result*base;
        num:=num shr 1
    end;

    writeln(result);
    readln
end.
ЗЫ При использовании чисел с плавающей точкой при больших значениях степени и основания получится погрешность тем больше, чем больше результат. Этот алгоритм можно расширить на действительно большие числа.

Последний раз редактировалось Carbon; 08.03.2008 в 23:44.
Carbon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как ВОЗВЕСТИ В СТЕПЕНЬ? Sova123456 Помощь студентам 2 14.05.2008 20:19
Найти и вывести все слова,у котоpых число гласных букв пpевышает число согласных. Briz Помощь студентам 2 11.05.2008 00:56
Степень Droid Общие вопросы Delphi 9 26.04.2008 01:51
Ввести число N и определить делится ли оно без остатка на число M (VBA) Ivanich Microsoft Office Excel 7 24.04.2008 19:43
Число N, заменить одну из его цифр, чтобы получилось число, max близкое к некоторой степени двойки urgu_st Помощь студентам 13 23.10.2007 09:14