Bài toán nhân hai số nguyên tố

4 1.2K 11
Bài toán nhân hai số nguyên tố

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

Thông tin tài liệu

Bài toán nhân hai số nguyên tố

Nhân hai số nguyên lớn với Giải thuật chia để trịPhạm Thế AnhVới bài toán đặt ra: Tính tíchhai số nguyên lớn nhập từ bàn phímnhư các bạn đã biết trong các số báotrước đã nêu ra nhiều cách giải và nhiều cách xử lý khác nhau, sau đây tôi cómột ý tưởng cho kết quả rất nhanh.Xét ví dụ phép nhân 2 số: S1=1234 và S2=5678Ta tách S1 thành 2 phần : a=12 ; b=34 suy raS1 =12*102+34 = a*102+bvà tách S2 thành 2 phần : c=56 ; d=78, vì vậy S2 = 56*102+78 = c*102+dKhi đó: S1*S2 =(a*102+b)*( c*102+d) = a*c*104 + a*d*102 + b*c*102 +b*dTheo ý tưởng đó ta viết hàm nhân hai số (mỗi số là mộtString) như sau:Function Nhan(S1,S2:string):string;1. Nếu độ dài S1 và S2 đều nhỏ hơn 5 ( số S1 và S2 có tối đa 4 chữ số ) ta chuyểnS1 và S2 thành số rồi tiến hành nhân hai số longint, kết quả chuyển thành chuỗitrả về giá trị cho hàm Nhan và thoát.2. Nếu độ dài S1 không bằng S2 thì thêm các số 0 vào trước S1 hoặc S2 để chúng códộ dài bằng nhau.3. Tiến hành tách S1,S2 thành các số a, b, c, d như sau: Lấy x=length(s1) div 2 ;L=length(s1)a:=copy(s1,1,x); { a là nửa đầu của s1 }b:=copy(s1,x+1,length(s1)-x); { blà nửa sau của s1 }c:=copy(s2,1,x); { c là nửa đầu của s2 }d:=copy(s2,x+1,length(s2)-x); { dlà nửa sau của s2 }Kết quả: Nhan:= nhan(a,c)*102(L-x)+ nhan(a,d)*10L-x + nhan (b,c)*10L-x + nhan(b,d);Chương trình:{$m65520,0,0} Function nhan(s1,s2:string):string;varx,i:byte;a,b,c,d,sac,sad,sbc,sbd:string;beginif(length(s1)<5)and(length(s2)<5)thennhan:=tost( tonum(s1)*tonum(s2)) elsebeginiflength(s1)then begin a:=s1; s1:=s2; s2:=a; end;whilelength(s1)>length(s2) dos2:='0'+s2;x:=length(s1) div 2;a:=copy(s1,1,x); { a la nua dau cua s1 }b:=copy(s1,x+1,length(s1)-x); { bla nua sau cua s1 }c:=copy(s2,1,x); { c la nua dau cua s2 }d:=copy(s2,x+1,length(s1)-x); { dla nua sau cua s2 }sac:=<b>nhan(a,c); {Tinh a*c roi nhan cho 102(L-x) }for i:=1 to (length(s1)-x)*2 dosac:=sac+'0';sad:=<b>nhan(a,d); { Tinh a*d roi nhan cho 10L-x }for i:=1 to length(s1)-x dosad:=sad+'0';sbc:=<b>nhan(b,c); {Tinh b*c roi nhan cho 10L-x }for i:=1 to length(s1)-x dosbc:=sbc+'0';sbd:=<b>nhan(b,d); {Tinh b*d }nhan:=cong(cong(sac,sad),cong(sbc,sbd));end; end;Chương trình có sử dùng các hàmphụ:{chuyển chuỗi St thành số nguyên dương }function tonum(s:string):longint;var l:longint;code:integer;beginval(s,l,code);tonum:=l;end;{chuyển số nguyên dương n thành chuỗi }Function toST(l:longint):string;var s:string;Beginstr(l,s);tost:=s;End;{cộng hai số nguyên dương lớn (hai chuỗi) }Function cong(s1,s2:string):string;var i:byte;Begin{ Lam cho do dai s1 va s2 bang nhau }while length(s1)>length(s2) do s2:='0'+s2; while length(s1)< s1:="0"> s1:=s1+'0';s2:=s2+'0';for i:=1 to length(s1) do s1[i]:=chr(ord(s1[i])-48);for i:=1 to length(s2) do s2[i]:=chr(ord(s2[i])-48);{ Cong }for i:=length(s1)-1 downto 1 dobegins1[i]:=chr( ord(s1[i+1]) div 10 + ord(s1[i])+ ord(s2[i]) );s1[i+1]:=chr( ord(s1[i+1]) mod 10 )end;if s1[1]>#9 then begin s:=chr(ord(s[1]) div 10)+s; s[2]:=chr( ord(s[2]) mod 10); end;{ ketqua }for i:=1 to length(s1) do s1[i]:=chr(ord(s1[i])+48);delete(s1,length(s1),1);cong:=s1;End; . Nhân hai số nguyên lớn với Giải thuật chia để trịPhạm Thế AnhVới bài toán đặt ra: Tính tíchhai số nguyên lớn nhập từ bàn phímnhư. hàm nhân hai số (mỗi số là mộtString) như sau:Function Nhan(S1,S2:string):string;1. Nếu độ dài S1 và S2 đều nhỏ hơn 5 ( số S1 và S2 có tối đa 4 chữ số )

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

Từ khóa liên quan

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

Tài liệu liên quan