Chuyen dề 2 SỐ HỌC

17
Chương 1: HỆ ĐẾM 1. Khái niệm hệ đếm: Hệ đếm được hiểu là tập các kí hiệu và quy tắc sử dụng tập các kí hiệu đó để biểu diễn và xác định giá trị các số. Trong hệ đếm cơ số b (b>1), các kí hiệu được dùng có các giá trị tương ứng 0, 1, .., b-1. Giả sử N có biểu diễn: d n d n-1 d n-2 ...d 1 d 0 , d -1 d -2 ...d -m Trong đó n +1 số các chữ số bên trái, m là số các chữ số bên phải dấu phân chia phần nguyên và phần phân của số N và các d i phải thỏa mãn điều kiện: 0 ≤ d i < b (-m ≤ i ≤ n) Khi đó giá trị của số N được tính theo công thức: N = d n b n + d n-1 b n-1 +...+d 0 b 0 +d -1 b -1 +...+d -m b -m (1) Chú ý: Để phân biệt số được biểu diễn ở hệ đếm nào người ta viết cơ số làm chỉ số dưới của số đó. Ví dụ: N b là biểu diễn N ở hệ đếm b. 2. Các hệ đếm thường dùng: * Hệ thập phân (hệ cơ số 10) dùng 10 kí hiệu 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Ví dụ: 28,9 10 = 2 x 10 1 + 8 x 10 0 + 9 x 10 -1 * Hệ nhị phân (hệ cơ số 2) chỉ dùng hai kí hiệu 0, 1 Ví dụ: 10 2 = 1 x 2 1 +0 x 2 0 = 2 10 101,1 2 = 1 x 2 2 + 0 x 2 1 + 1 x 2 0 + 1 x 2 -1 = 5,5 10 * Hệ hexa (hệ cơ số 16) sử dụng các kí hiệu 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, trong đó A, B, C, D, E, F nhận các giá trị tương ứng 10, 11, 12, 13, 14, 15 trong hệ thập phân. Ví dụ: AF0 16 = 10 x 16 2 + 15 x 16 1 + 0 x 16 0 = 2800 10 3. Chuyển đổi biểu diễn số ở hệ thập phân sang hệ đếm cơ số khác: Nguyên tắc 1 : C huyển từ hệ cơ số thập phân sang một hệ cơ số bất kỳ Để chuyển từ hệ thập phân sang hệ cơ số bất kỳ, nguyên tắc là cứ chia số đó lấy phần dư rồi tiếp tục chia phần

Transcript of Chuyen dề 2 SỐ HỌC

Chương 1:

HỆ ĐẾM

1. Khái niệm hệ đếm:Hệ đếm được hiểu là tập các kí hiệu và quy tắc sử dụng

tập các kí hiệu đó để biểu diễn và xác định giá trị các số.Trong hệ đếm cơ số b (b>1), các kí hiệu được dùng có các giátrị tương ứng 0, 1, .., b-1. Giả sử N có biểu diễn:

dndn-1dn-2...d1d0 , d-1d-2...d-m

Trong đó n +1 số các chữ số bên trái, m là số các chữ sốbên phải dấu phân chia phần nguyên và phần phân của số N vàcác di phải thỏa mãn điều kiện:

0 ≤ di < b (-m ≤ i ≤ n)Khi đó giá trị của số N được tính theo công thức:N = dnbn + dn-1bn-1 +...+d0b0 +d-1b-1 +...+d-mb-m (1)

Chú ý: Để phân biệt số được biểu diễn ở hệ đếm nào người taviết cơ số làm chỉ số dưới của số đó. Ví dụ: Nb là biểu diễn N ở hệđếm b.2. Các hệ đếm thường dùng:* Hệ thập phân (hệ cơ số 10) dùng 10 kí hiệu 0, 1, 2, 3, 4, 5, 6, 7, 8, 9Ví dụ: 28,910 = 2 x 101 + 8 x 100 + 9 x 10-1

* Hệ nhị phân (hệ cơ số 2) chỉ dùng hai kí hiệu 0, 1Ví dụ: 102 = 1 x 21 +0 x 20 = 210

101,12 = 1 x 22 + 0 x 21 + 1 x 20 + 1 x 2-1 = 5,510

* Hệ hexa (hệ cơ số 16) sử dụng các kí hiệu 0, 1, 2, 3, 4,5, 6, 7, 8, 9, A, B, C, D, E, F, trong đó A, B, C, D, E, Fnhận các giá trị tương ứng 10, 11, 12, 13, 14, 15 trong hệthập phân.Ví dụ: AF016 = 10 x 162 + 15 x 16 1 + 0 x 16 0 = 280010

3. Chuyển đổi biểu diễn số ở hệ thập phân sang hệ đếm cơ số khác:Nguyên tắc 1 : Chuyển từ hệ cơ số thập phân sang một hệ cơ số bất kỳ

Để chuyển từ hệ thập phân sang hệ cơ số bất kỳ, nguyêntắc là cứ chia số đó lấy phần dư rồi tiếp tục chia phần

nguyên lấy phần dư tiếp sau đó xếp thứ tự ngược từ dưới lên.Ví dụ: Lấy số 3295 (trong hệ thập phân) 3295 chia 2 = 1647.5  (1647 -> Dư 1)1647 (phần nguyên) chia 2 = 823.5 -> Dư 1823 chia 2 = 411.5 -> Dư 1411 chia 2 = 205.5 -> Dư 1205 chia 2 = 102.5 -> Dư 1102 chia 2 = 51 -> Dư 051 chia 2 = 25.5 -> Dư 125 chia 2 = 12.5 -> Dư 112 chia 2 = 6 -> Dư 06 chia 2 = 3 -> Dư 03 chia 2 = 1.5 -> Dư 11 chia 2 = 0.5 -> Dư 1 (phần nguyên < 1 thì dừng)Sắp xếp các số dư từ dưới lên trên ta được: 3295 (demical) =110011011111 (binary).

Cũng với số này ta chuyển từ 10 sang thập lục phân thì như sau :3295 chia 16 = 205.9375 (205 dư 15) tức là chữ số F trong hệhexa đó205 chia 16 = 12.8125 (12 dư 13) tức là D12 chia 16 = 0.75 (0 dư 12) tức là CVậy số đó trong hệ hexa là CDF.

** Đối với phần lẻ của số thập phân, chuyển sang nhị phânsố lẻ được nhân với 2. Phần nguyên của kết quả sẽ là bit nhịphân, phần lẻ của kết quả lại tiếp tục nhân 2 cho đến khiphần lẻ của kết quả bằng 0.

Ví dụ: Chuyển số 0.62510 sang hệ nhị phân 0.625 x 2 = 1.25, lấy số 1, phần lẻ 0.25 0.25 x 2 = 0.5, lấy số 0, phần lẻ 0.5 0.5 x 2 = 1.0, lấy số 1, phần lẻ 0. Kết thúc phép chuyển đổi, lấy phần dư từ trên xuốngVới các hệ khác cũng tương tự.Nguyên tắc 2 : Chuyển từ hệ cơ số bất kỳ ra thập phânCó 1 số nhị phân A như sau:A=anan-1an-2…a1a0 .a-1a-2…a-m

Dấu chấm là dấu phân cách hàng thập phân. Giá trị của A đượctính như sau:

A=an2n + an-12n-1 + an-22n-2 +…+a121 + a020 + a-12-1+ a-22-2 +…+ a-m2-m

Ví dụ về số nhị phân: Chuyển số 1110110.110101 sang số thập phân1 1 1 0 1 1 0 .1 1 0 1 0 1

6 5 4 3 2 1 0 -1-2-3-4-5-6

1110110.110101=1x26 + 1x25 + 1x24 + 0x23 + 1x22 + 1x21 + 0x20 + 1x2-1 +1x2-2 + 0x2-3 + 1x2-4+ 0x2-5 + 1x 2-6

= 64 + 32 + 16 + 0 + 4 + 2 + 0 + 0.5 + 0.25 + 0 + 0.0625 + 0+ 0.015625 = 118.828125Vậy 1110110.110101 2 = 118.828125 10

Với các hệ khác cũng tương tự.Nguyên tắc 3 : Chuyển nhanh các hệ cơ số là bội của 2 Có cái bảng các hệ cơ số nhị phân - thập lục - bát phân - thập phân sau đây0000 | 0 | 0 | 00001 | 1 | 1 | 10010 | 2 | 2 | 20011 | 3 | 3 | 30100 | 4 | 4 | 40101 | 5 | 5 | 50110 | 6 | 6 | 60111 | 7 | 7 | 71000 | 8 | 10 | 81001 | 9 | 11 | 91010 | A | 12 | 101011 | B | 13 | 111100 | C | 14 | 121101 | D | 15 | 131110 | E | 16 | 141111 | F | 17 | 15

Ví dụ chuyển nhị phân sang thập lục phân :1100110111112 -> 1100 1101 1111 -> C D F (bảng thì tra hoặc học thuộc)

Quá trình ngược lại cũng tương tư từ C tra bảng ra 4 bitnhị phân nào.Ở trên ta có thể áp dụng để chuyển qua lại giữa các giá trị

nhị phân <-> thập lục hoặc nhị phân <-> bát phân. Muốnchuyển giữa thập lục và bát phân thì chuyển trung gian quanhị phân.Nguyên tắc 4 : Chuyển nhanh các hệ cơ số 10 với hệ nhị phânBase-10 Decimal Conversion—63204829Baseexponent 107 106 105 104 103 102 101 100

Column Value 6 3 2 0 4 8 2 9Decimal Weight1000000

01000000

10000010000 1000 100 10 1

Column Weight 60000000

3000000

2000000 4000 800 20 9

60000000 + 3000000 + 200000 + 0 + 4000 + 800 + 20 + 9 = 63204829.Base-2 Binary Conversion—1110100 (233)Baseexponent 27 26 25 24 23 22 21 20

Column Value 1 1 1 0 1 0 0 1Decimal Weight128 64 32 16 8 4 2 1Column Weight 128 64 32 0 8 0 0 1128 + 64 + 32 + 0 + 8 + 0 + 0 + 1 = 233--------------------------------------------------------------------------------------------------

Chương 2SỐ NGUYÊN TỐ

Một số tự nhiên p (p>1) là số nguyên tố nếu p có đúng hai ước số là 1và p.

Ví dụ các số nguyên tố: 2, 3, 5, 7, 11, 13, 17, 19, 23,...1. Kiểm tra tính nguyên tố:a. Phương pháp kiểm tra số nguyên tố truyền thống: Nhập vào 1 số. Xác địnhxem số đó có phải số nguyên tố hay không.Ý tưởng: Số nguyên tố là số chia cho 1 và chính nó. Giả sửsố vừa nhập vào là n, ta cho i chạy từ 2 đến n-1, nếu n chiahết cho i trong bất cứ lần lặp nào thì có nghĩa là n khôngnguyên tố, nếu không chia hết cho bất cứ lần lặp nào lànguyên tố. Về nguyên tắc là như vậy, nhưng người ta đã chứngminh được rằng chỉ cần xét từ 1 đến phần nguyên căn 2 của N.Như thế thuật toán sẽ tối ưu hơn.

Chương trình Pascal:program kiem_tra_nguyen_to;uses crt;var n,i:integer; bl:boolean;begin clrscr; bl:=true; write('nhap vao so can kiem tra tinh nguyen to: '); readln(n); if n<=1 then bl:=false; for i:=2 to trunc(sqrt(n)) then  if n mod i=0 then bl:=false; if bl=true then write('so vua nhap nguyen to.') else write('so vua nhap khong nguyen to.');readln;end.

Chứng minh: Chỉ cần xét từ 1 đến phần nguyên căn 2 của Nthay vì xét đến N: 

Lấy ví dụ số không nguyên tố:9=3*312=3*418=2*9=3*620=4*5=2*10

Trong các ví dụ trên, các số không nguyên tố được phân tích thành tích cáccặp ước của chúng, trong mỗi cặp số nhỏ đứng trước, số lớn đứng sau. Trongmỗi cặp, ta có thể thấy rõ một điều: số đứng trước (nhỏ hơn) luôn luôn nhỏ hơnhoặc bằng căn bậc hai của số cần xét. Ví dụ ta thấy 20=4*5, rõ ràng 4 nhỏ hơncăn bậc hai của 20. Có thể chứng minh được điều này bằng toán học như sau:

Gọi số cần xét là n, căn bậc hai của nó là x, hai ướctương ứng có tích bằng n của nó là a và b(a<>b), ta cầnchứng minh a<x hoặc b<x. Vì a và b có vai trò tương đương,nên ta giả sử a<b.

Giả sử a>x và b>x, ta có a*b>x*x=n => trái với giảithiết. Vậy trong hai số a và b, phải có một số nhỏ hơn x. Dựa vào đặc điểm trên, ta sẽ giới hạn phạm vi của i là 2->n-1 thành 2->sqrt(n). Tuy nhiên, sqrt(n) với n không chínhphương sẽ ra số vô tỉ, trong khi i là số nguyên, vậy cần làm

tròn sqrt(n). Phạm vi mới sẽ là 2->trunc(sqrt(n)). (trunc(x) là lấy phần nguyên của x)

b. Phương pháp kiểm tra số nguyên tố theo xác suấtTừ định lý nhỏ Fermat: Nếu p là số nguyên tố và a là số tự nhiên thì ap

mod p = aTa có cách kiểm tra tính nguyên tố của Fermat:

Nếu 2n mod n # 2 thì n không là số nguyên tốNếu 2n mod n = 2 thì nhiều khả năng n là số nguyên tố

Ví dụ:29 mod 9 = 512 mod 9 = 8 #2, do đó số 9 không là số nguyên tố23 mod 3 = 8 mod 3 = 2, do đó nhiều khả năng 3 là số nguyên tố, thực tế 3 là số nguyên tố211 mod 11 = 2048 mod 11 = 2, do đó nhiều khả năng 11 là sốnguyên tố, thực tế 11 là số nguyên tố.--------------------------------------------------------------------------------------------------

Chương 3 ƯỚC SỐ, BỘI SỐ

1. Số các ước số của một sốGiả sử N được phân tích thành thừa số nguyên tố như sau:

N = ai bj ... ck

Ước số của N có dạng: ap bq ... cr trong đó 0 p i, 0 q j, ... , 0 ≤ ≤ ≤ ≤ r k≤ ≤

Do đó, số các ước số của N là (i+1) (j+1) ... (k + 1).

Ví dụ:* N = 100 = 22 x 52, số ước số của 100 là: (2+1)(2+1) = 9 ước số (các ước số đó là: 1, 2, 4, 5, 10, 20, 25, 50, 100).* N= 24 = 23 x 3, số ước số của 24 là: (3+1)(1+1) = 8 ước số(các ước số đó là: 1, 2, ,3, 4, 6, 8, 12, 24)2. Tổng các ước số của một số:

N = ai bj ... ck

Đặt N1 = bj ... ck

Gọi F(t) là tổng các ước của t, ta có:F(N) = F(N1) + a F(N1) + ... + ai F(N1)

= (1 + a + ... + ai) F(N1) = F(N1)

= ...

Ví dụ: Tổng các ước của 24 là:

x = 60

3. Ước số chung lớn nhất của hai số Ước số chung lớn nhất (USCLN) của 2 số được tính theo

thuật toán Euclid USCLN(a,b) = USCLN (b,(a mod b))Chương trình conFunction USCLN(a,b:longint):longint; var tmp :longint; begin

while b>0 do begin

a:=a mod b; tmp:=a; a:=b; b:=tmp;

end; exit(a); end;

4. Bội số chung nhỏ nhất Bội số chung nhỏ nhất (BSCNN) của hai số được tính theo côngthức:

BSCNN (a,b) = = x b

--------------------------------------------------------------------------------------------------

Chương 4:LÝ THUYẾT TẬP HỢP

1. Các phép toán trên tập hợp

a. Phần bù của A trong X: kí hiệu Ᾱ, là tập hợp các phần tử củaX không thuộc A:

Ᾱ = { x X: x A}

b. Hợp của A và B: kí hiệu A B. Là tập hợp các phần tử thuộc

vào A hoặc thuộc vào B: A B = {x:x A hoặc x B}c. Giao của A và B: kí hiệu A B, là tập hợp các phần tử đồngthời thuộc cả A và B:

A B = {x:x A và x B}d. Hiệu của A và B: kí hiệu A\B, là tập hợp các phần tử thuộctập A nhưng không thuộc B: A\B = {x:x A vàx B}2. Các tính chất của phép toán trên tập hợp:a. Kết hợp:

(A B) C = A (B C)

(A B) C = A (B C)b. Giao hoán:

A B = B A

A B = B Ac. Phân bố:

A (B C) = (A B) (A C)

A (B C) = (A B) (A C)d. Đối ngẫu

=

= 3. Tích Đề - các của các tập hợp

Tích Đề - các ghép hai tập hợp: A B = {(a,b)| a A, b B}

Tích Đề - các mở rộng ghép nhiều tập hợp:A1 A2 ... Ak = {(a1, a2, ..., ak)| ai Ai, i = 1, 2,...,k}

4. Nguyên lý cộngNếu A và B là hai tập hợp rời nhau thì |A B| = |A| + |B|

Nguyên lý cộng mở rộng cho nhiều tập hợp đôi một rời nhau:

Nếu {A1, A2, ..., Ak} là một phân hoạch của tập X thì:|X| = |A1| +|A2| + ... + |Ak|

5. Nguyên lý bù trừ:Nếu A và B không rời nhau thì:

|A B| = |A| + |B| - |A B|

Nguyên lý mở rộng cho nhiều tập hợp:Giả sử A1, A2, ..., Am là các tập hữu hạn:

|A1 A2 ... Am| = N1 – N2 + ... + (-1)m-1Nm

Trong đó Nk là tổng phần tử của tất cả các giao cua ktập lấy từ m tập đã cho6. Nguyên lý nhân:

Nếu mỗi thành phần ai của bộ có thứ tự k thành phần (a1,a2, ..., ak) có ni khả năng lựa chọn (i = 1, 2, ..., k), thì số bộ sẽ đượctạo ra là tích số của các khả năng này n1 n2 ... nk

Một hệ quả trực tiếp của nguyên lý nhân:|A1 A2 ... Ak| = |A1| |A2| ... |Ak|

7. Chỉnh hợp lặp:Xét tập hữu hạn gồm n phần tử A = {a1, a2, ..., an}Một chỉnh hợp lặp chập k của n phần tử là một bộ có thứ

tự gồm k phần tử của A, các phần tử có thể lặp lại. Mộtchỉnh hợp lặp chập k của n có thể xem như một phần tử củatích Đề - các Ak. Theo nguyên lý nhân, số tất cả các chỉnhhợp lặp chập k của n sẽ là nk

= nk

8. Chỉnh hợp không lặp:Một chỉnh hợp không lặp chập k của n phần tử (k n) là

một bộ có thứ tự gồmk phần tử lấy từ n phần tử của tập đã cho. Các thành phầnkhông được lặp lại. Để xây dựng một chỉnh hợp không lặp, taxây dựng dần từng phần tử đầu tiên. Thành phần này có n khả

năng lựa chọn. Mỗi thành phần tiếp theo, số khả năng lựachọn giảm đi 1 so với thành phần đứng trước, do đó theonguyên lý nhân, số chỉnh hợp không lặp chập k của n sẽ làn(n-1)...(n – k + 1).

= n(n - 1) ... (n – k +1)=

9. Hoán vịMột hoán vị của n phần tử là một cách xếp thứ tự các

phần tử đó. Một hoán vị của n phần tử được xem như mộttrường hợp riêng của chỉnh hợp không lặp khi k = n. Do đó sốhoán vị của n phần tử là n!10. Tổ hợp

Một tổ hợp chập k của n phần tử (k n) là một bộ không kểthứ tự gồm k thành phần khác nhau lấy từ n phần tử của n đã cho.

= =

Một số tính chất: =

= = 1

= + (với 0 < k < n)

--------------------------------------------------------------------------------------------------

Chương 5 SỐ FIBONACCI

Số Fibonacci được xác định bởi công thức sau:F0 = 0F1 = 1Fn = Fn-1 + Fn-2 với n 2

Một số phần tử đầu tiên của dãy số Fibonacci

N 0 1 2 3 4 5 6 ...Fibonac

cin0 1 1 2 3 5 8 ...

Chương trìnhProgram catalan;uses crt;var i,n,f1,f2: integer;begin clrscr; write('Nhap n: '); readln(n); f1:=0; f2:=1; for i:=1 to n do begin  write(f1,' ');  f2:=f2+f1;  f1:=f2-f1; end; readln;end. * Số Fibonacci là đáp án của các bài toán: bài toán cổ vềviệc sinh sản của các cặp thỏ, đếm số cách xếp n – 1 thanhDOMINO --------------------------------------------------------------------------------------------------

Chương 6 SỐ CATALAN

Số Catalan được xác đính bởi công thức sau:

Catalann = = với n 0

Một số phần tử đầu tiên của dãy số CatalanN 0 1 2 3 4 5 6 ...

Catalann

1 1 2 5 14 42 132 ...

Thuật toánChưa viết

* Số catalan là đáp án của các bài toán: có bao nhiêu cáchkhác nhau đặt n dấu ngoặc mở và n dấu ngoặc đóng đúng đắn?Có bao nhiêu cây nhị phân khác nhau có đúng (n + 1) lá? Chomột đa giác lồi (n+2) đỉnh, ta chia đa giác thành các tamgiác bằng cách vẽ các đường chéo không cắt nhau trong đagiác. Hổi có bao nhiêu cách chia như vậy?

--------------------------------------------------------------------------------------------------

Chương 7 XỬ LÝ SỐ NGUYÊN LỚN

Nhiều ngôn ngữ lập trình cung cấp kiểu dữ liệu nguyênkhá lớn, chẳng hạn trong Free Pascal có kiểu số 64 bit(khoảng 19 chữ số). Tuy nhiên ñể thực hiện các phép tính vớisố nguyên ngoài phạm vi biểu diễn ñuợc cung cấp (có hàngtram chữ số chẳng hạn), chúng ta cần tự thiết kế cách biểudiễn và các hàm thực hiện các phép toán co bản với các sốnguyên lớn. 1. Biểu diễn số nguyên lớn Thông thuờng người ta sử dụng các cách biểu diễn số nguyênlớn sau: Xâu kí tự: đây là cách biểu diễn tự nhiên và đơn giảnnhất, mỗi kí tự của xâu tương ứng với một chữ số của sốnguyên lớn tính từ trái qua phải. Mảng các số: Sử dụng mảng lưu các chữ số (hoặc một nhómchữ số), và một biến ghi nhận số chữ số để thuận tiện trongquá trình xử lí. Danh sách liên kết các số: Sử dụng danh sách liên kết cácchữ số (hoặc một nhóm chữ số), cách làm này sẽ linh hoạt hơntrong việc sử dụng bộ nhớ. Trong phần này, sử dụng cách biểu diễn thứ nhất, biểu diễn số nguyên lớn bằngxâu kí tự và chỉ xét các số nguyên lớn không âm. Type bigNum = string; 2. Phép so sánh

Để so sánh hai số nguyên lớn a, b được biểu diễn bằngxâu kí tự, truớc tiên ta thêm các chữ số 0 vào đầu số có số

chữ số nhỏ hơn để hai số có số luợng chữ số bằng nhau. Sauđó sử dụng trực tiếp phép toán so sánh trên xâu kí tự. Hàm cmp so sánh hai số nguyên lớn a, b. Giá trị hàm trả về

0 nếu a = b1 nếu a>b-1 nếu a<b

Thuật toán:function cmp(a,b : bigNum): integer; begin

while length(a)<length(b) do a:='0'+a; while length(b)<length(a) do b:='0'+b; if a = b then exit(0); if a > b then exit(1); exit(-1);

end;3. Phép cộng

Phép cộng hai số nguyên ñuợc thực hiện từ phải qua trái và phần nhớ ñuợc mang sang trái. Function add(a,b : bigNum): bigNum; var sum, carry, i, x, y : integer;

c: bigNum; begin

carry:=0;c:=''; while length(a)<length(b) do a:='0'+a; while length(b)<length(a) do b:='0'+b; for i:=length(a) downto 1 do begin

x:= ord(a[i])-ord('0'); {ord('0')=48} y:= ord(b[i])-ord('0'); sum:=x + y + carry; carry:=sum div 10;c:=chr(sum mod 10 +48)+c;

end; if carry>0 then c:='1'+c; add:=c;

end;4. Phép trừ

Thực hiện phép trừ ngược lại với việc nhớ ở phép cộng taphải chú ý đến việc vay muợn từ hàng cao hơn. Trong hàm trừduới đây, chỉ xét truờng hợp số lớn trừ số nhỏ hon.

function sub(a,b:bigNum):bigNum; var c:bigNum;

s,borrow,i :integer; begin

borrow:=0;c:=''; while length(a)<length(b) do a:='0'+a; while length(b)<length(a) do b:='0'+b; for i:=length(a) downto 1 do begin

s:=ord(a[i])-ord(b[i])-borrow; if s<0 then begin

s:=s+10; borrow:=1;

end else borrow:=0; c:=chr(s +48)+c;

end; while (length(c)>1)and(c[1]='0') do delete(c,1,1);sub:=c;

end;5. Phép nhân một số lớn với một số nhỏ

Số nhỏ ở đây đuợc hiểu là số nguyên do ngôn ngữ lậptrình cung cấp (như: longint, integer,..). Hàmmultiply1(a:bigNum;b:longint):bigNum, trả về là một sốnguyên lớn (bigNum) là kết quả của phép nhân một số nguyênlớn a (bigNum) với một số b (longint). function multiply1(a:bigNum;b:longint):bigNum; var i:integer;

carry,s:longint; c,tmp:bigNum;

begin c:=''; carry:=0; for i:=length(a) downto 1 do begin

s:=(ord(a[i])-48) * b + carry; carry:= s div 10; c:=chr(s mod 10 + 48)+c;

end; if carry>0 then str(carry,tmp) else tmp:=''; multiply1:=tmp+c;

end; 6. Phép nhân hai số nguyên lớn function multiply2(a,b:bigNum):bigNum; var sum,tmp:bigNum;

m,i,j:integer; begin

m:=-1;sum:=''; for i:=length(a) downto 1 do begin

m:=m+1; tmp:=multiply1(b,ord(a[i])-48);

{có thể thay câu lệnh tmp:=multiply1(b,ord(a[i])-48); bằng cách cộng nhiều lần như sau: tmp:=''; for j:=1 to ord(a[i])-48 do tmp:=add(tmp,b); nhu vậy hàm nhân multiply2 chỉ gọi hàm cộng hai số nguyên lớn add}

for j:=1 to m do tmp:=tmp+'0'; sum:=add(tmp,sum); end; multiply2:=sum;

end; 7. Phép toán chia lấy thuong nguyên (div) của một số lớn với một số nhỏ Function bigDiv1(a:bigNum;b:longint):bigNum; var s,i,hold:longint; c:bigNum; begin

hold:=0;s:=0; c:=''; for i:=1 to length(a) do begin

hold:=hold*10 + ord(a[i])-48; s:=hold div b; hold:=hold mod b; c:=c+chr(s+48);

end; while (length(c)>1) and(c[1]='0') do delete(c,1,1); bigDiv1:=c;

end; 8. Phép toán chia lấy dư (mod) của một số lớn với một số nhỏfunction bigMod1(a:bigNum;b:longint):longint; var i,hold:longint; begin

hold:=0; for i:=1 to length(a) do

hold:=(ord(a[i])-48+hold*10) mod b; bigMod1:=hold;

end; * * Chú ý: ta có các công thức sau:1. (A + B) mod N = ((A mod N) + (B mod N)) mod N2. (A x B) mod N = ((A mod N) x (B mod N)) mod N

9. Phép toán chia lấy thương nguyên (div) của hai số lớn function bigDiv2(a,b:bigNum):bigNum; var c,hold :bigNum; kb :array[0..10]of bigNum;

i,k :longint; begin kb[0]:='0';

for i:=1 to 10 do kb[i]:=add(kb[i-1],b); hold:=''; c:=''; for i:=1 to length(a) do begin hold:=hold+a[i]; k:=1; while cmp(hold,kb[k])<>-1 do

inc(k); c:=c+chr(k-1+48); hold:=sub(hold,kb[k-1]);

end; while (length(c)>1)and(c[1]='0') do delete(c,1,1);

bigDiv2:=c; end;10. Phép toán chia lấy dư (mod) của hai số lớn Function bigMod2(a,b:bigNum):bigNum; var hold :bigNum;

kb :array[0..10]of bigNum; i,k :longint;

begin kb[0]:='0'; for i:=1 to 10 do

kb[i]:=add(kb[i-1],b); hold:=''; for i:=1 to length(a) do begin

hold:=hold+a[i]; k:=1; while cmp(hold,kb[k])<>-1 do

inc(k); hold:=sub(hold,kb[k-1]);

end; bigMod2:=hold;

end;