Bài toán xử lý số siêu lớn

3 3.3K 81
Bài toán xử lý số siêu lớn

Đang tải... (xem toàn văn)

Thông tin tài liệu

Bài toán xử lý số siêu lớn

Một ý tưởng cho bài toán xử số siêu lớnHải Minh- Trịnh HảiKhi viết chương trình bằng một ngôn ngữ lập trình, ta thường phải sử dụng bộ dữ liệu chuẩn của ngôn ngữ đó mà đã được định nghĩa trước. Với bộ dữ liệu chuẩn dành cho dữ liệu kiểu số thì có đặc điểm là sẽ bị giới hạn về phạm vị biểu diễn. Một trong những cách để ta khắc phục tình trạng này là ta sẽ chuyển số sang dạng xâu và thực hiện các phép toán trên từng số hạng xâu đó. Nhưng làm theo cách này thì ta cũng mới chỉ biểu diễn được số có tối đa là 255 chữ số muốn tăng khả năng biểu diễn lên ta cần phải khai báo nhiều biến kiểu xâu.Trong bài viết này, chúng tôi xin giới thiệu một cách xử số lớn nhưng dữ liệu được tổ chức theo kiểu mảng mỗi phần tử của mảng có kiểu dữ liệu là kiểu Byte mà 1 Byte sẽ mô tả được hai chữ số của số lớn. Cụ thể: giả sử ta có số 15 và 50 thì ta sẽ được mô tả 4 bit cao lưu trữ hàng chục, 4 bít thấp lưu hàng đơn vị:Khi đó thì để tách chữ số phần được lưu ở phần bit thấp ta sẽ thực hiện phép toán logic và (And) với $0F, để tách chữ số lưu phần bít cao ta thực hiện phép dịch sang phải 4 bit (Shr). Bằng cách này chúng tôi xây dựng chương trình nhập và tính tổng hai số siêu lớn bằng ngôn ngữ Pascal.Uses Crt;ConstNumMax=512;TypeNumbers=Array[0 NumMax] Of Byte;VarSo1,So2,Tong:Numbers;Procedure Input(Var A:Numbers);Vari,j,Code:Integer;Num: Char;NTmp:Array[0 NumMax*2] Of Byte;BeginWriteln('Nhap vao so that lon');i:=0;FillChar(A,SizeOf(a),0);RepeatNum:=Readkey;If Num in ['0' '9'] ThenBegin Write(Num);Val(Num,NTmp[i],Code);I:=i+1;End;Until Ord(Num)=13;i:=i-1;j:=NumMax;While i>=0 doBeginA[j]:=NTmp[i]+(NTmp[i-1] shl 4);i:=i-2;j:=j-1;End;Writeln;End;Procedure WriteNumber(A:Numbers);Vari,j:Integer;HN,LN:Byte;Begini:=0;While (i<=NumMax) And (A[i]=0) do i:=i+1;If i<=NumMax ThenBeginFor j:=i to NumMax doBeginLN:=A[j] And $0F;HN:=A[j] shr 4;Write(HN,LN);End;EndElse Write(0);Writeln;End;Procedure AđAB(A,B:NumBers;Var C:Numbers);Vari:integer;LN,HN,TL,TH:Byte;BeginFillChar(C,SizeOf(C),0);For i:=NumMax Downto 1 doBeginLN:=(A[i] and $0F) + (B[i] and $0F) +TH;Tl:=LN div 10;LN:=LN Mod 10;HN:=(A[i] Shr 4) + (B[i] Shr 4) +TL;TH:=HN div 10; HN:=HN Mod 10;HN:=HN shl 4;C[i]:=(LN+HN);End;End;Begininput(So1);input(So2);AđAB(So1,So2,Tong);Writeln('Tong ');WriteNumber(Tong);Readln;End. . Một ý tưởng cho bài toán xử lý số siêu lớnHải Minh- Trịnh HảiKhi viết chương trình bằng một ngôn ngữ lập. ta cần phải khai báo nhiều biến kiểu xâu.Trong bài viết này, chúng tôi xin giới thiệu một cách xử lý số lớn nhưng dữ liệu được tổ chức theo kiểu mảng mỗi

Ngày đăng: 07/09/2012, 11:11

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan