Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Целочисленные переменные.
Перевод чисел в позиционных системах счисления.
Занятие 2
Алгоритм перевода чисел из Q-ричной системы счисления в 10-ю выполняется школьниками довольно легко. В систем счисления с основанием Q числа в развернутй форме записываются в виде суммы ряда степеней основания Q (степени от 0 до N-1, где N – количество позиций в записи данного числа), умноженных на коэффициенты ai, где ai - цифры числа, записанные в Q-ричной системе счисления.
Aq = an-1 * qn-1 + an-2 * qn-2 + ….+ a0* q0 + a-1 * q-1 + a-2 * q-2 + …..+ a--m * q-m
Пример
Запись числа в свернутой форме по основанию 8: А8 = 451,38
В развернутой форме: А8 =4*82 +5*81 +1+80 +3*8-1
Очевидно, что для представления чисел в развернутой форме, необходимо уметь выделять цифры в записи этого числа. На первом этапе мы будем рассматривать только целочисленные переменные.
Задача 1
Дано число в Q-ричной ( в интервале от 2 до 9) системе счисления. Преобразовать его в 10-ю систему счисления.
program test (input,output);
var (*Перевод из Q-ричной (от 2 до 9) системы счисления в 10-ю*)
a:array[1..8] of integer;
a1,an, i,j, s,q:integer;
begin
writeln ('Введите число ');
readln(a1); an:=a1;
writeln ('Введите основание Q ');
readln(q);
i:=1;
(* выделяем цифры из заданного числа a1*)
(* i - счетчик числа позиций в заданном числе а1*)
while a1 > 0 do
begin
a[i]:=a1 mod 10;
a1:=a1 div 10;
writeln('i ',i,' a[',i:2,'] ',a[i]);
i:=i+1;
end;
(*представить заданное число в 10-ой системе счисления*)
(* p – переменная, в которой формируются степени заданного основания *)
s:=0; p:=1;
for j:=1 to i-1 do
begin
s:=s+p*a[j];
p:=p*q;
writeln('s ',s,' p ',p);
end;
(* распечатка результата *)
writeln('заданное число',an,'в ',q,'-ричной системе счисления');
writeln(‘число в 10-ой системе счисления ’,s);
end.
Задача 2
Дано число в Q-ричной ( в интервале от 2 до 16) системе счисления. Преобразовать его в 10-ю систему счисления.
Алгоритм задачи
В 11-16-ричных системах счисления в записи числа используются буквы латинского алфавита от A до F. Для выделения позиций заданного числа, мы принимаем его как переменную типа – string, используем массив a:array[1..8] of integer. Массив ssch: array[10..n] of char, будет необходим для преобразования символов алфавита в числовые значения. Адреса элементов массива прямо пропорциональны значениям символов. Это видно и в блоке присваивания ( в начале текста программы после раздела описания переменных). В разделе (*выделяем символы из заданного числа a1*) при выделении символа, соответствующего букве в массив a заносится число, равное адресу этого символа в массиве ssch. Последующее преобразование числа из Q-ричной системы счисления в 10-ю (2-й блок программы) – в точноcти повторяет алгоритм 1 задачи.
program test (input, output);
(*Перевод из Q-ричной (от 2 до 16) системы счисления в 10-ю*)
const n=15;
var
a1,an:string;
ssch: array[10..n] of char;
a:array[1..8] of integer;
l1,i, j,r, s,p, sn, q:integer;
begin
ssch[10]:='A'; ssch[11]:='B'; ssch[12]:='C'; ssch[13]:='D'; ssch[14]:='E'; ssch[15]:='F';
writeln (' Введите число в виде строки символов');
readln(a1); an:=a1;
writeln ('Введите основание Q ');
readln(q);
(*выделяем символы из заданного числа a1*)
l1:=length(a1);
for i:=l1 downto 1 do
begin
r:=ord(a1[i])-ord('0');
writeln('kod ',ord(a1[i]),' SIMVOL ',a1[i]);
if (a1[i]<='9') and (a1[i]>='0') then a[l1+1-i]:=r
else begin for j:=10 to q-1 do
if a1[i] = ssch[j] then a[l1+1-i]:=j;
end;
writeln(' nach ',a1[i],' mas A ',a[l1+1-i]);
end;
(*представить заданное число в 10-ой системе счисления *)
s:=0; p:=1;
for j:=1 to l1 do
begin
s:=s+p*a[j];
p:=p*q;
writeln('s ',s,' p ',p);
end;
(*распечатка результата*)
writeln('заданное число ',an,' в ',q,'-ричной системе счисления ');
write('число в 10-ой системе счисления ',s);
end.
Задача 3
Дано число в 10-ой системе счисления преобразовать его в R-ричную ( в интервале от 2 до 9) систему счисления.
Алгоритм перевода целого 10-го числа в R-ричную ( в интервале от 2 до 9) систему счисления:
Последовательно выполнять деление исходного целого числа, сохраняя остатки от целочисленного деления в массиве b:array[1..12] of integer; Новое целое частное делим на основание R, до тех пор пока остаток не станет меньше основания R. Первый остаток от деления соответствует младшей цифре заданного числа в R-ричной ( в интервале от 2 до 9) системе счисления, последний – старшей.program test (input, output);
(*Перевод из 10-ой системы счисления в R-ричную (от 2 до 9) *)
var
b:array[1..12] of integer;
i, j,s, r,sn:integer;
begin
writeln (' Введите число ');
readln(s);
writeln ('Введите основание R ');
readln(r);
sn:=s; i:=1;
while s > 0 do
begin
b[i]:=s mod r;
s:=s div r;
writeln('i ',i,' b[',i:1,'] ',b[i]);
i:=i+1;
end;
(*распечатка результата *)
writeln('заданное число в ',r,' системе счисления’);
for j:=I-1 downto 1 do
write(b[j]);
end.
Задача 4
Дано число в 10-ой системе счисления преобразовать его в R-ричную ( в интервале от 2 до 16) систему счисления.
Комментарий: При работе с сиcтемами счисления больше 10-ой используем массив ssch: array[10..n] of char, котрый будет необходим для преобразования числовых значений в символы алфавита. В массиве bn будем формировать результат преобразования.
Прокомментируем фрагмент программы:
if b[j]>9 then bn[j]:=ssch[b[j]]
else bn[j]:= CHR(b[j]+ORD('0'));
Если остаток от деления оказался больше 9, то необходимо выбрать из массива ssch, символ, адрес которого совпадает со значением b[j], иначе формируем число.
program test (input, output);
(*Перевод из 10-ной системы счисления в R-ную (от 2 до 16) *)
const n=15;
var
ssch: array[10..n] of char;
b:array[1..12] of integer;
bn: array[1..12] of char;
i, j,r, s,p, sn, q:integer;
begin
ssch[10]:='A'; ssch[11]:='B'; ssch[12]:='C'; ssch[13]:='D'; ssch[14]:='E'; ssch[15]:='F';
writeln (' Введите число в 10-ой системе счисления');
readln(s); sn:=s;
writeln ('Введите основание R ');
readln(r);
sn:=s; i:=1;
while s > 0 do
begin
b[i]:=s mod r;
s:=s div r;
writeln('i ',i,' b[',i:1,'] ',b[i]);
i:=i+1;
end;
(*распечатка результата *)
writeln('заданное число в ',r,' - ой системе счисления’);
if p<=10 then
begin
for j:=I-1 downto 1 do write(b[j]);
end
else
for j:=I-1 downto 1 do
begin
if b[j]>9 then bn[j]:=ssch[b[j]]
else bn[j]:= CHR(b[j]+ORD('0'));
write(bn[j]);
end;
end.
Задача 5
Дано число в Q-ой системе счисления преобразовать его в R-ричную ( в интервале от 2 до 16) систему счисления, используя перевод его в 10-ю, как промежуточный этап работы.
Комментарий: в 5 задаче использованы все приемы преобразования задач 1-4.
program test (input, output);
(*Перевод из Q-ричной (от 2 до 16) системы счисления в R-ю˛*)
const n=15;
var
a1,an:string;
ssch: array[10..n] of char;
a, b:array[1..12] of integer;
bn: array[1..12] of char;
l1,i, j,r, q:integer;
s, sn, p:longint;
begin
ssch[10]:='A'; ssch[11]:='B'; ssch[12]:='C'; ssch[13]:='D'; ssch[14]:='E'; ssch[15]:='F';
writeln ('Введите число в виде строки символов');
readln(a1); an:=a1;
writeln ('Введите основание Q ');
readln(q);
writeln (' Введите основание R ');
readln(r);
(*выделяем символы из заданного числа a1*)
l1:=length(a1);
for i:=l1 downto 1 do
begin
p:=ord(a1[i])-ord('0');
writeln('kod ',ord(a1[i]),' SIMVOL ',a1[i]);
if (a1[i]<='9') and (a1[i]>='0') then a[l1+1-i]:=p
else begin for j:=10 to q-1 do
if a1[i] = ssch[j] then a[l1+1-i]:=j;
end;
writeln(' nach ',a1[i],' mas A ',a[l1+1-i]);
end;
(*представить заданное число в 10-ой системе счисления *)
s:=0; p:=1;
for j:=1 to l1 do
begin
s:=s+p*a[j];
p:=p*q;
writeln('s ',s,' p ',p); (* для отладки *)
end;
(*распечатка результата *)
writeln('заданное число ',an,' в ',q,'-ричной системе счисления’);
write('число в 10-ой системе счисления ',s);
writeln;
sn:=s; i:=1;
while s > 0 do
begin
b[i]:=s mod r;
s:=s div r;
writeln('i ',i,' b[',i:1,'] ',b[i],' ssch ',ssch[b[i]]);
i:=i+1;
end;
(*распечатка результата*)
writeln('заданное число в ',r,' системе счисления');
if p<=10 then
begin
for j:=I-1 downto 1 do
write(b[j]);
end
else
for j:=I-1 downto 1 do
begin
if b[j]>9 then bn[j]:=ssch[b[j]]
else bn[j]:=CHR(b[j]+ ORD('0'));
write(bn[j]);
end;
end.
Олимпиадные задачи
ТГУ май 2005 года
Задача 6.
(z6.in, z6.out, z6.pas, z6.cpp)
Перевести число из десятичной в двоичную систему счисления
Формат входного файла: Одно число 1 < N < 32000.
Формат выходного файла: Одно число – заданное число в двоичной системе счисления.
Пример:
Z6.in 3 | Z6.out 11 |
Z6.in 785 | Z6.out |
Задача 7.
(z7.in, z7.out, z7.pas, z7.cpp)
Перевести число из десятичной в троичную систему счисления
Формат входного файла: Одно число 1 < N < 32000.
Формат выходного файла: Одно число – заданное число в троичной системе счисления.
Пример:
Z7.in 3 | Z7.out 10 |
Z7.in 785 | Z7.out 1002002 |
Предложенные задачи могут быть реализованы в рамках вышеприведенных алгоритмов.
Городская олимпиада по информатике 2003 год
Задача 2
Требуется написать программу, которая водит несколько целых чисел ( со знаком «+» или «-» ) в заданной системе счислени и вычисляет их алгебраичекую сумму.
Порядок ввода исходных данных
основание системы счисления в виде целого числа ( оно должно находиться в пределах от 2 до 10); знак «+» или «-», следом без пробела запись первого суммируемого числа в заданной системе счисления; то же самое для второго суммируемого числа и т. д.Окончание ввода – число 0.
Оценка задачи
величина каждого из чисел и их суммы не более 32000 – 20 баллов; величина каждого из чисел и их суммы не более 1баллов дополнительно.Выходные данные:
Знак «+» или «-» и цифры полученной суммы в заданной системе счисления. При этом НЕ должны выводиться ведущие нули.
Пример ввода: Пример вывода
3 +22
+102
-11
+1
0
Возможные варианты реализации задачи
В случае величина каждого из чисел и их суммы не более 32000: перевести числа в 10-ю систему счисления, произвести необходимые операции и выполнить обратный перевод в заданную систему счисления. В случае величина каждого из чисел и их суммы не более 1050 : принять с клавиатуры данные вида: символьные строки – STRING. Преобразовать в массивы символов и работать по алгоритмам арифметики (если в данном разряде, после суммирования, число превышает основание системы счисления вычесть основание и признак переноса изменить с 0 на 1). При вычитании поступать аналогично, если вычитаемое больше уменьшаемого, из старшего разряда вычесть 1, а к уменьшаемому прибавить основание системы счисления и продолжить вычисления. Эти приемы работы были приведены в теме «Целочисленные переменные. Занятие 1»

