Мысал. лкен сандарды кбейтіндісін табу.

Те лкен сандара амалдар олдану есептері

 

Кбінесе олимпиадаларда берілетін есептер лкен сандарды табуа арналан арифметикалы операцияларды олдану арылы шешіледі. Бл есептерді шешу барысында біз алдыны сабата арастыран бір лшемді массивтер мен атарды деуді типтік алгоритмдерін пайдаланамыз.

Жмысты масаты: лкен сандарды шыаруа арналан операцияларды олданып классикалы дістер арылы есептерді шыару.

32 разрядты жйені архитектурасы максималды диапазондаы сандарды 0..4294967295 деуге ммкіндік береді. Біра кптеген олданбалы есептерді шешу шін бл сандар аралыы жеткіліксіз(3.1-кесте).

Мліметтер:

Анытамалы мліметтер:

3.1-кесте. Бтін сандарды форматы
Типті сипаттау зындыы(байт) Минималды сан Максималды сан
Integer 2 (табалы) -32768 +32767
Shortint 1 (табалы) -128 +127
Longint 4 (табалы) -2147483648 +2147483647
Byte 1 (табасыз)
Word 2 (табасыз)

Улкен сандарды шыару операцияларын тжірбие жзінде арастырамыз.

 

Мысал. те лкен санды бір табалы сана кбейту керек.

Есепті шешуін мысалмен арастырайы: айталы, 4510905723598 санын 3-ке кбейту ажет болсын.

· Санды жолды айнымалы арылы ендіреміз (йткені, берілген 1 табалы санды сипаттайтын бтін тип арастырылмаан.

· Санны цифрларын ажыратып, массив элементтеріне орналастырып жазамыз:

4 5 1 0 9 0 5 7 2 3 5 9 8

· Оларды райсысын 3-ке кбейтеміз:

12 15 3 0 27 0 15 21 6 9 15 27 24

· Ауыстыруды йымдастырамыз: рбір яшыта кіші разрядты цифрды алдырамыз, ал лкен разрядты цифрды сол жатаы яшыта тран сана осамыз.

Сурет 3.1

 

Паскальдаы программа лгісі:

const m=100;var a, b: array [1..m] of integer; i, n, x, k: integer; s: string;begin writeln ('зын санды енгіз: '); readln (s); n:= length (s); writeln ('Кбейткішті енгіз: '); readln (x); for i:=1 to n do val (copy(s, i, 1), a[i], k); for i:=1 to n do b[i]:= a[i] * x; for i:=n downto 2 do begin b[i - 1]:= b[i - 1] + b[i] div 10; b[i]:= b[i] mod 10; end; {нтиже} for i:=1 to n do write (b[i]);end.

Тест:

Берілгені:
Натижесі:

2-мысал: Екі лкен санны осындысын табу:

Есепті шешу идеясы:екі лкен санды осу мысалын арастырамыз: 4510905723569 жне 361295487.

Сандарды жолды айнымалылар арылы ендіреміз. рбір санны цифрларын ажыратып алып, массив элементтеріне орналастырамыз. Екі санны кішісі сан саталатын массивті (бл массив b болсын) 5-ші яшытан бастап толтырамыз.


Сурет 3.2

Sum массивін толтыру шін a жне b массивіні сйкес яшытарын осамыз. Содан со орын ауыстыруды йымдастырамыз: рбір яшыта кіші разрядты цифрды алдырамыз, ал лкен разрядты цифрды сол жатаы яшыта тран сана осамыз.

Программаны Паскальдаы лгісі:

const mm=100;var a,b, sum: array [1..mm] of integer; i, n, m,max, x, k: integer; sA, sB: string;begin writeln ('бірінші сан: '); readln (sA); writeln ('екінші сан: '); readln (sB); n:= length (sA); m:= length (sB); if n>m then max:=n else max:=m; for i:=1 to n do begin val(copy(sA, i, 1),x,k); a[i+(max-n)]:=x; end; for i:=1 to m do begin val(copy(sB, i, 1),x,k); b[i+(max-m)]:=x; end; {======осу===========} for i:=1 to max do sum[i]:= a[i]+b[i]; for i:=max downto 2 do begin sum[i-1]:=sum[i-1] + sum[i] div 10; sum[i]:= sum[i] mod 10; end; {====нтиже===========} for i:=1 to max do write (sum[i]);end.

Тест:

Берілгені:
Нтижесі:

мысал. лкен сандарды кбейтіндісін табу.

Есепті шешу идеясы схемада крсетілген (3.3-сурет):


3.3. Сурет

  • b массивіні е соы элементін a массивіні барлы элеметтеріне кбейтеміз. Нтижесін Nat массивіне сатаймыз;
  • Sum массиві мен 1 позицияа сола жылжытылан Nat массивіні элементтерін осамыз; Нтижесін Sum-а жазамыз;
  • b массивіні келесі элементін (соынан екіншісі) алып, алдыы екі адамды айталаймыз;
  • экрана Sum массивін шыарамыз.

Программаны Паскальдаы лгісі:

const mm=100;var a,b,nat,sum: array [1..mm] of integer; i, j, n, m, max, x, k: integer; sA, sB: string;begin writeln ('бірінші кбейткіш: '); readln (sA); writeln ('екінші кбейткіш: '); readln (sB); n:= length(sA); m:= length(sB); {======цифрлара бліп алу===============} for i:= 1 to n do begin val(copy(sA, i, 1),x,k); a[i]:= x; end; for i:= 1 to m do begin val(copy(sB, i, 1),x,k); b[i]:= x; end; {== j-ші цифра кбейту ============} for j:= m downto 1 do begin for i:= 1 to n do nat[i]:= a[i] * b[j]; for i:= n downto 2 do begin nat[i - 1]:= nat[i - 1] + nat[i] div 10; nat[i]:= nat[i] mod 10; end; {==== сырыта отырып осынды табу ==============} for i:= 1 to n do sum[i + j - 1]:= sum[i + j - 1] + nat[i]; for i:= n downto 2 do begin sum[i - 1]:= sum[i - 1] + sum[i] div 10; sum[i]:= sum[i] mod 10; end; end; {====нтиже=================} for i:= 1 to n + m - 1 do write (sum[i]);end.

Тест: