из курса вам известно, что цифры десятичной записи числа – это просто коэффициенты его представления в виде суммы степеней числа – основания системы счисления:
при переводе чисел из десятичной системы счисления в римскую мы и воспользовались этим правилом (444 = 400 + 40 + 4; 2986 = 2000 + 900 + 80 + 6).
при записи чисел значение каждой цифры зависит от ее положения. место для цифры в числе называется разрядом, а количество цифр в числе разрядностью. на самом деле числа можно записывать как сумму степеней не только числа 10, но и любого другого натурального числа, большего 1.
определение. развернутой формой записи числа называется такая запись: а4а3а2а1а0 = а4*q4 + a3*q3 + a2*q2 + a1*q1 + a0*q0 , где а4,а3,а2,а1,а0 –цифры числа, q –основание степени.
пример1. получить развернутую форму числа 7512410.
решение:
а4 = 7, а3 = 5, а2 =1 ,а1 =2, а0 =4, q=10
4 3 2 1 0
75 12410 = 7*104 + 5*103 + 1*102 + 2*101 + 4*100.
пример2. получить развернутую форму числа 1123.
решение:
2 1 0
1123 = 1*32 + 1*31 +2*30
пример3. получить развернутую форму числа 176,218.
решение: 21 0-1-2а8=176, 218=1*82+7*81+6*80+2*8-1+1*8-2 для самостоятельной работы: 1. запишите в развернутом виде числа: а8=143511,62а2=100111а10=143,511а16=1а3,5с12. запишите в свернутой форме число: 9*101+1*100+5*10-1+3*10-2a*162+1*161+c*160+3*16-1
type R = record v: integer; p: integer end; mR = array[1..n] of R;
function SummOfDigits(n: integer): integer; { Сумма цифр в трехзначном числе } begin SummOfDigits := (n div 100) + ((n mod 100) div 10) + (n mod 10) end;
procedure Swp(var a, b: R); { Меняет местами элементы a и b } var t: R; begin t.v := a.v; t.p := a.p; a.v := b.v; a.p := b.p; b.v := t.v; b.p := t.p end;
procedure Shell(var a: mR; n: integer); { сортировка методом Шелла } var i, j, step: integer;
begin step := n div 2; while step > 0 do begin for j := n - step downto 1 do begin i := j; while i <= n - step do begin if a[i].v > a[i + step].v then Swp(a[i], a[i + step]); i := i + step end end; step := step div 2 end end;
var a: array[1..n] of integer; b: mR; i: integer;
begin Randomize; Writeln('*** Исходные элементы массива ***'); for i := 1 to n do begin a[i] := Random(900) + 100; b[i].v := SummOfDigits(a[i]); b[i].p := i; Write(a[i]:4) end; Writeln; Shell(b, n); Writeln('*** Упорядоченные по возрастанию суммы цифр элементы массива ***'); for i := 1 to n do begin Write(a[b[i].p]:4) end; Writeln end.
§1. о системах счисления.
n4. развернутая форма записи числаиз курса вам известно, что цифры десятичной записи числа – это просто коэффициенты его представления в виде суммы степеней числа – основания системы счисления:
25076 = 2*10000 + 5*1000 + 0*100 + 7*10 + 6*1 = 2*104 +5*103 + 0*102 +7*101+6*100
при переводе чисел из десятичной системы счисления в римскую мы и воспользовались этим правилом (444 = 400 + 40 + 4; 2986 = 2000 + 900 + 80 + 6).
при записи чисел значение каждой цифры зависит от ее положения. место для цифры в числе называется разрядом, а количество цифр в числе разрядностью. на самом деле числа можно записывать как сумму степеней не только числа 10, но и любого другого натурального числа, большего 1.
определение. развернутой формой записи числа называется такая запись: а4а3а2а1а0 = а4*q4 + a3*q3 + a2*q2 + a1*q1 + a0*q0 , где а4,а3,а2,а1,а0 –цифры числа, q –основание степени.
пример1. получить развернутую форму числа 7512410.
решение:
а4 = 7, а3 = 5, а2 =1 ,а1 =2, а0 =4, q=10
4 3 2 1 0
75 12410 = 7*104 + 5*103 + 1*102 + 2*101 + 4*100.
пример2. получить развернутую форму числа 1123.
решение:
2 1 0
1123 = 1*32 + 1*31 +2*30
пример3. получить развернутую форму числа 176,218.
решение: 21 0-1-2а8=176, 218=1*82+7*81+6*80+2*8-1+1*8-2 для самостоятельной работы: 1. запишите в развернутом виде числа: а8=143511,62а2=100111а10=143,511а16=1а3,5с12. запишите в свернутой форме число: 9*101+1*100+5*10-1+3*10-2a*162+1*161+c*160+3*16-1const
n = 16;
type
R = record
v: integer;
p: integer
end;
mR = array[1..n] of R;
function SummOfDigits(n: integer): integer;
{ Сумма цифр в трехзначном числе }
begin
SummOfDigits := (n div 100) + ((n mod 100) div 10) + (n mod 10)
end;
procedure Swp(var a, b: R);
{ Меняет местами элементы a и b }
var
t: R;
begin
t.v := a.v; t.p := a.p;
a.v := b.v; a.p := b.p;
b.v := t.v; b.p := t.p
end;
procedure Shell(var a: mR; n: integer);
{ сортировка методом Шелла }
var
i, j, step: integer;
begin
step := n div 2;
while step > 0 do
begin
for j := n - step downto 1 do
begin
i := j;
while i <= n - step do
begin
if a[i].v > a[i + step].v then Swp(a[i], a[i + step]);
i := i + step
end
end;
step := step div 2
end
end;
var
a: array[1..n] of integer;
b: mR;
i: integer;
begin
Randomize;
Writeln('*** Исходные элементы массива ***');
for i := 1 to n do
begin
a[i] := Random(900) + 100;
b[i].v := SummOfDigits(a[i]);
b[i].p := i;
Write(a[i]:4)
end;
Writeln;
Shell(b, n);
Writeln('*** Упорядоченные по возрастанию суммы цифр элементы массива ***');
for i := 1 to n do
begin
Write(a[b[i].p]:4)
end;
Writeln
end.
Тестовое решение:
*** Исходные элементы массива ***
862 244 599 379 595 840 551 151 614 383 185 893 131 172 139 256
*** Упорядоченные по возрастанию суммы цифр элементы массива ***
131 151 244 172 551 614 840 139 256 185 383 862 595 379 893 599