6. Ý nghĩa khoa học và thực tiễn cửa đề tài
2.2.1 So sánh hai số [2], [4]
Để so sánh đối tƣợng số nguyên lớn trƣớc hết ta so sánh hai số nguyên lớn không âm trƣớc, sau đó mới so sánh số nguyên lớn có dấu.
Thuật toán so sánh hai đối tƣợng số nguyên lớn không âm: Cho hai số lớn không âm bn1 và bn2 có độ dài len1 và len2. Để so sánh hai số trƣớc tiên ta so sánh độ dài của bn1 và bn2 nếu len1 > len2 thì bn1 > bn2, ngƣợc lại nếu len1 < len2 thì bn1 < bn2. Trƣờng hợp nếu len1 = len2 ta duyệt từ cuối danh sách ( do lƣu trữ ngƣợc ) đến đầu danh sách của hai số nếu phần tử thứ i (0 ≤ i ≤ len1) bn1.data[i] > bn2.data[i] thì bn1 > bn2, ngƣợc lại nếu bn1.data[i] < bn2.data[i] thì bn1 < bn2. Sau khi duyệt xong mọi phần tử danh sách bằng nhau bn1.data[i] = bn2.data[i] với mọi i thì bn1 = bn2.
Input: Hai đối tƣợng số lớn bn1, bn2 có độ dài len1 và len2
Output:
- Nếu bn1 > bn2 thì retum l. - Nếu bn1 < bn2 thì retum -1. - Nếu bn1 = bn2 thì return 0.
Algorithm: ComparePositive
1.myAbs(bn1); myAbs(bn2);//Lấy giá trị tuyệt đối 2.If (len1 > len2) return 1; // bn1 > bn2
3.if (len1 < len2) return -1;// bn1 < bn2 4.If (len1 = len2)
4.1 For ( i = len1 - 1 ; i >= 0; --i){ sbyte n11 = bn1.data[i];
sbyte n12 = bn2.data[i];
If (bn1[i]!= bn2[i]) return (n11 < n12)?-1:1; } 5.return 0
Để xây dựng phƣơng thức lấy trị tuyệt đối của số lớn trƣớc tiên ta xây dựng phƣơng thức kiểm tra số nguyên lớn có âm hay không (tên phƣơng thức:
isNagative). Nếu số lớn là âm trả về true, ngƣợc lại số lớn không âm trả về false. Do cách lƣu trữ số lớn nhƣ đã trình bày ở trên nếu mà vị trí cuối cùng của danh sách của số lớn = 1 thì số là âm, nếu không thì là dƣơng.
Input: Đối tƣợng số lớn bn có độ dài len. Output:
- Nếu bn là âm thì return true. - Nếu bn là dƣơng thì return false.
Algorithm: isNagative
1.If (bn.data[len 1 ]== -1) return true; else return false;
Xây dựng hàm lấy giá trị tuyệt đối của số nguyên lớn (tên hàm: myAbs): Kiểm tra xem có âm hay không, nếu là âm để đổi đấu ta chỉ bỏ giá trị ở cuối danh sách (bằng 1) và cập nhật lại độ dài của đối tƣợng số nguyên.
Input: Đối tƣợng số lớn bn có độ dài len.
Output:
- Trị tuyệt đối của bn.
Algorithm: myAbs
1.if (this.isNagative()){ //kiem tra la am this.data.Remove(-1);
this.len = this.len - 1; return this;
}
2.return this;
Thuật toán so sánh hai số nguyên lớn: Cho hai số lớn bn1 và bn2 có độ dài len1 và len2. Để so sanh hai số bn1 và bn2 ta làm nhƣ sau: nếu bn1 dƣơng và bn2 âm thì bn1 > bn2, ngƣợc lại nếu bn1 âm và bn2 dƣơng thì
bn1 < bn2. Nếu bn1 và bn2 cùng dƣơng dùng thuật toán so sánh số không âm nhƣ đã trình bày. Nếu bn1 và bn2 cùng âm, sử dụng thuật toán so sánh với đối tƣợng số không âm trƣớc nếu số nào lớn hơn thì nhỏ hơn và ngƣợc lại.
Input: Hai đối tƣợng số lớn bn1, bn2 có độ dài len1 và len2
Output:
- Nếu bn1 > bn2 thì retum l. - Nếu bn1 < bn2 thì retum 1 - Nếu bn1 = bn2 thì return 0.
Algorithm: Compare
1.If (bn1 dương và bn2 âm) return 1; // bn1 > bn2 2.if (bn1 âm và bn2 dương) return -1;// bn1 < bn2 3.If (bn1 dương và bn2 dương)
return ComparePositive(bn1, bn2);//ham so sanh so khong am
4.If (bn1 âm và bn2 âm){
int i = ComparePositive(bn1,bn2);//ham so sanh so khong am if(i==1) return -1;// bn1 < bn2 if(i ==-1) return 1; bn1 > bn2 return 0; // bn1 = bn2 } 5.return 0; // bn1 = bn2
Từ thuật toán so sánh (Compare) trên sử dụng phƣơng pháp chồng toán tử so sánh để định nghĩa các phép so sánh số nguyên lớn.
So sánh lớn (>) hơn giữa hai số nguyên lớn bn1 và bn2:
public static bool operator >(BigNum bn1, BigNum bn2) {
return (Compare(bn1, bn2) == 1); }
So sánh nhỏ (<) hơn giữa hai số nguyên lớn bn1 và bn2:
public static bool operator <(BigNum bn2, BigNum bn2) {
return (Compare(bn2, bn2) == -1); }
So sánh bằng (==) giữa hai số nguyên lớn bn1 và bn2:
public static bool operator ==(BigNum bn2, BigNum bn2) {
return (Compare(bn2, bn2) == 0); }
So sánh khác (!=) giữa hai số nguyên lớn bn1 và bn2:
public static bool operator !=(BigNum bn2, BigNum bn2) {
return (Compare(bn2, bn2) != 0); }
So sánh lớn hơn hoặc bằng (>=) giữa hai số nguyên lớn bn1 và bn2:
public static bool operator >=(BigNum bn2, BigNum bn2) {
return((Compare(bn2,bn2)==1)||(Compare(bn2,bn2)==0)); }
So sánh nhỏ hơn hoặc bằng (<=) giữa hai số nguyên lớn bn1 và bn2:
public static bool operator <=(BigNum bn2, BigNum bn2) {
return((Compare(bn2,bn2)==-1)||(Compare(bn2,bn2)==0)); }