6. Ý nghĩa khoa học và thực tiễn cửa đề tài
2.2.2 Cộng hai số lớn không âm [2], [4], [5]
Việc cộng số nguyên lớn không âm ta tiến hành cộng lần lƣợt từ đầu danh sách đến danh sách có độ dài nhỏ nhất, sau đó ta cộng số dƣ với các số tiếp theo bắt đầu từ phần tử có độ dài lớn hơn 1 của danh sách có độ dài nhỏ, cuối cùng trả về là đối tƣợng số nguyên.
Giả sửa có hai đối tƣợng số lớn a có thuộc tính data:
a0 a1 … an và b có thuộc tính data:
b0 b1 … bm
Việc cộng hai số lớn a và b ta tiến hành nhƣ sau:
Bƣớc 1: Tìm min của độ dài hai số giả sử min(a.len, b.len) = n +1
Bƣớc 2: Ta cộng từng phần tử của số a với phần tử b từ vị trí 0 đến vị trí min(a.len, b.len) = n +1:
Phần tử thứ 0: c = 0, t = 0
t = a0 + b0 + c; Nếu t > 9 t = t 9; c = 1. Nếu t < 9 c = 0. Thêm t vào kết quả của phép cộng.
Tiếp theo đến phần tử thứ 1:
t = a1 + b1 + c; Nếu t > 9 t = t 9; c = 1. Nếu t < 9 c = 0. Thêm t vào kết quả của phép cộng.
….
Tiếp theo đến phần tử thứ n + 1:
t = an + 1 + bn + 1 + c .Nếu t > 9 t = t 9; c = 1. Nếu t < 9 c = 0. Thêm t vào kết quả của phép cộng.
Bƣớc 3: Tiến hành Cộng c vào phần tử thứ n + 2 của số b đến hết Phần tử thứ n + 2:
t = c +bn + 2 . Nếu t > 9 t = t 9; c = 1. Nếu t < 9 c = 0. Thêm t vào kết Tiếp theo đến phần tử thứ n +3:
t = c + bn + 3 nếu t > 9 t = t 9; c = 1. Nếu t < 9 c = 0. Thêm t vào kết quả của phép cộng.
…
Tiếp theo đến phần tử thứ m + 1:
t = c +bm + 1 nếu t > 9 t = t 9; c = 1. Nếu t < 9 c = 0. Thêm t vào kết quả của phép cộng.
Cuối cùng nếu c = 1 thêm 1 vào kết quả của phép cộng.
Thí dụ: có hai số 5329 và 22 đƣợc biểu diễn trong số lớn a: 9 2 3 5
và số lớn b:
2 2
Ta tiến hành cộng hai số lớn a và b theo các bƣớc trình bày ở trên:
Bƣớc 1: min(a.len,b.len) = min(4,2) = 2
Bƣớc 2: Cộng từng phần tử của a với phần tử của b từ phần tử vị trí 0 đến phần tử vị trí 2: Phần tử thứ 0: c = 0; t = 0 t = a0 + b0 + c = 9 + 2 + 0 = 11 vì t = 11 > 9 t = 10 t = 1; c = 1. Thêm t = 1 vào kết quả: 1 Phần tử thứ 0: c = 1
t = a1 + b1 + c = 2 + 2 + 1 = 5 vì t = 5 < 9 c = 0. Thêm t = 5 vào kết quả: 1 5
Bƣớc 3: Tiến hành Cộng c = 0 vào phần tử ở vị trí thứ 3 của số b đến hết (phần tử ở vị trí thứ 4):
Phần tử thứ 3 của b: c = 0
t = b2 + c = 3 + 0 = 3 vì t = 3 < 9 c = 0. Thêm t = 3 vào kết quả: 1 5 3
Phần tử thứ 4 cảu b: c = 0
t = b3 + c = 5 + 0 = 5 vì t = 5 < 9 c = 0. Thêm t = 5 vào kết quả: 1 5 3 5
Kết quả cuối cùng của phép cộng hai đối tƣợng a và b là đối tƣợng có thuộc tính data:
1 5 3 5 Hay: 5329 + 22 = 5351
Giải thuật cộng hai đối tƣợng số lớn không âm:
Input: Hai đối tƣợng số lớn không âm bn1, bn2 có độ dài len1 và len2
Output:
Đối tƣợng bn = bn1 + bn2
Algorithm: Add(bn1, bn2)
1.BigNum BN = new BigNum(), sbyte t, c = 0, int i; 2.If(BN.isNagative()) 3.n = Math.Min(bn1.len, bn2.len); 4.For (i = 0; i < n; ++i) { t = (sbyte)(bn1.data[i] + bn2.data[i] + c); if (t > 9) { t -= 10; c = 1; } else{ c = 0; } BN.data.Add(t); }
5.For (i = n; i < len1; ++i) { t = (sbyte)(bn1.data[i] + c); if (t > 9) { t -= 10; c = 1; } else{ c = 0; } BN.data.Add(t); }
5. For (i = n; i < len2; ++i) { t = (sbyte)(bn2.data[i] + c); if (t > 9) { t -= 10; c = 1; } else{ c = 0; } BN.data.Add(t); } 6 BN.len = BN.data.Count; 7.return BN;