chuyen de toan 112010

6 5 0
chuyen de toan 112010

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

Thông tin tài liệu

Trong lóc ®ã nhiÒu bµi to¸n cÇn thùc hiÖn phÐp to¸n víi hµng tr¨m, thËm chÝ hµng ngµn ch÷ sè... C¸c bµi to¸n øng dông.[r]

(1)

Chuyên đề

C¸c phÐp tÝnh víi sè lín NNLT Pascal ( VVSưu., GV Tr-êng THPT chuyªn HN-AMSTERDAM)

I. Đặt vấn đề

Do hạn chế nhớ, nên phép toán cộng, trừ, nhân, chia NNLT pascal thực đ-ợc số nhỏ Trong lúc nhiều tốn cần thực phép tốn với hàng trăm, chí hàng ngàn chữ số Chúng ta sử dụng vài cấu trúc liệu nh- xâu, mảng thuật toán học từ thời THCS để thực u cầu tính tốn cỏc s ln

II Các toán

Bài toán Cộng sè lín

Input: Cho S1, S2 lµ số nguyên d-ơng, số có số chữ số <=200 (nhập d-ới dạng xâu)

Output: S1+S2 Thuật toán:

- Tạo thủ tục :

+procedure DOI (S:string, Var a :mang);

{ đổi kí tự số từ S thành số t-ơng ứng mảng a (với thứ tự ngựợc lại)}

Var n, i, cod: integer; Begin

n:=length(S);

For i:= n downto Begin

val(s[i],a[n-i],cod) End ;

+Procedure CONG (a,b: mang; var c:mang); Var nho, tg: integer;

Begin Nho:=0;

For i:= to 300 Begin

Tg:=a[i]+b[i]+ nho; c[i]:=tg mod 10; nho:=tg div 10; End;

(2)

+ procedure INKQ (c:mang); Var sc,i: integer;

Begin

For sc :=300 downto if c[sc]<>0 then break; For i:=sc downto write(c[i]);

End; Begin {main}

READLN( S1, S2); DOI(S1,a);

DOI(S2,b); CONG (a,b,c); INKQ(c); End

Bài toán HiƯu sè lín

Input : S1, S2 Xâu biểu diễn số (giả thiết s1 s2) Output : S1- S2

Begin

Readln(S1, S2);

DOI(s1,a); DOI(s2,b); TRU(a,b,h);

INKQ(h); End

Procedure TRU(a,b:mang;var h:mang); Var

Begin Muon:=0;

For i:=0 to 300 Begin

b[i]:=b[i]+muon;

If a[i]>=b[i] then begin h[i]:=a[i]-b[i]; muon:=0;end Else

Begin

muon:=1;

h[i]:=10+a[i]-b[i]; End;

End;

Bµi So s¸nh sè lín

Input: S1, S2 sè cã sè ch÷ sè <=200

(3)

Prorcedure sosanh(X,Y: string; Var biger, equal, less: Boolean); Begin

biger:=false; equal:=false; less:=false; nx:=length(X); ny:=length(Y); If X=Y then equal:=true

Else if nx> ny then biger:=true Else if ny> nx then less:=true Else

Begin i:=0;

While (X[i+1]=Y[i+1]) and (i<nx) inc(i); If i=nx then equal:=true;

Else if X[i]>Y[i] then Biger:=true Else less:=true;

End; End;

Begin{ Main} READLN (S1,S2);

SOSANH(S,S2,big, eq,les);

If les then begin tg:=S1; s1:=s2; s2:=tg; end; INKQ(S1, S2);

End

Bµi Nhân số lớn với số nguyên d-ơng ( pv m¸y tÝnh) Input : S - Xâu biểu diễn số lớn , n số nguyên d-¬ng

Output: S.n BEGIN

- NhËp S, nhËp n

- DOI(S,a){ doi xâu số S thành mảng a[0],, a[n]) - NHAN(a,n,T) { nhân a với n cho m¶ng tÝch T} - GHIKQ(T);

END

PROCEDURE NHAN(a:mang; n:integer; Var T:mang); Var

Begin

Fillchar(T,sizeof(T),0); Nho:=0; Tg:=0;

For i:=0 to 300 Begin

Tg:=a[i]*n +nho; T[i]:= Tg mod 10; Nho:=tg div 10 End;

(4)

Bài Nhân số lớn Input: sè S1, S2

Output S1.S2 Thuật toán:

+ Khai báo mảng c¸c byte: TG, KQ,a,b + DOI(S1,a); DOI(S2,b);

+ for i:=0 to 300 Begin

Nhan(a, b[i],TG);

For j:= to 300 CONG( TG, KQ, i); End;

+ INKQ; + cài đặt

Procedure CONG(TG: mang; var KQ: mang; i: integer); Var nho, t: integer;

Begin

Nho:=0; t:=0; For j:=0 to 300 Begin

t:=KQ[j+i]+TG[j]+nho; KQ[j+i]:= t mod 10; nho:= t div 10;

End;

End;

III Các toán ứng dụng

Bài Giai thừa Input : n nguyên d-ơng n<=200 Output:Tính giai thừa n!

Thuật toán:

+ Khai báo mảng : GT[0 1000] of byte { chøa kÕt qu¶}; + Khëi tạo a[0]:=1

(5)

Bài Tæng luü thõa

TÝnh Pn+Qm (P,Q ,m , n nguyên d-ơng<=200) Thuật toán:

+ Xây dung thđ tơc PROCEDURE LT(K, n: integer, var A:mang); {n©ng K lên luỹ thừa n, kết ghi vào m¶ng A}

For i:=1 to n NHAN( K,a) {chú ý khởi tạo a[0]:=1} + Gäi thñ tuc LT(P,n,A), LT(Q.m,B)

+Gäi thñ tuc CONG(A, B, C); + Ghi C

Bµi GhÐp HCN

Input: a , b, c , d , với a,b,c,d nguyên d-ơng kích th-ớc hình chữ nhật a x b c x d Hỏi từ hcn ghép đ-ợc thành hcn Output : hcn ghép đ-ợc thành hcn khác Nếu ghép đ-ợc cho biết chu vi lớn

Bµi BCNN

Cho dãy số nguyên dương a1, a2, a3,…, an (n<=10000, 0<ai<109) Tìm BCNN(a1,a2,…,an) (Đề thi HSG Hà nội 2010)

ThuËt to¸n:

+ Xét dãy số nguyên tố khoảng tứ đến n: Snt:=0;

For p:=2 to n

If OK (P) then {if P nguyên tô} Begin

Inc(snt) NT[snt]:=p;

+ XÐt d·y sè mị max cđa sè nguyªn tè NT[i] -ớc a1,a2, Khởi tạo Mmax[i]:=0;(i=1 snt)

+ for i:= to n {xÐt a1, a2,…} Begin

Tg:=a[i];

For j:= to snt Begin

mm:=0

While tg mod nt[j] =0 Begin

(6)

End;

If mm>mmax[j] then mmax[j]:=mm; End;

End;

+ Gäi m¶ng bc[0], bc[1],,,bc[300] BCNN (ghi theo tt ng-ợc) +Khởi tao bc[0]:=1

+

For i:=1 to snt If mmax[i]>0 then

For j:= to mmax[i] nhan (bc, nt[i])

+ GHI gäi nbc: số khác không cuối bc For nbc:=300 downto if bc[nbc]<>0 then break; For i:= nbc downto write(BC[I]);

Ngày đăng: 17/05/2021, 22:07

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

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

Tài liệu liên quan