, , , . , () , . , ,
30! = 265252859812191058636308480000000?
.
, , "". "" " ".
"" , . "" , , , "" . , , , , .
"" . .
30! = 265252859812191058636308480000000
:
30! = 2 * (104)8 + 6525 * (104)7 + 2859 * (104) + 8121 * (104)5 + 9105 * (104)4 + 8636 * (104)3 + 3084 * (104)2 + 8000 * (104)1 + 0000 * (104)0.
, . 1.
1
, "" 10000-10 (- , - ), "" .
. 9 [0], " "? , . .
. !
. "" . .
Const MaxDig = 1000; { !} Osn = 10000; { , } Type Tlong = Array[0..MaxDig] Of Integer; { }"" .
23851674 (Osn) 1000 ( ). ( Ch) . 2.
|
|
2
[0] | [1] | [2] | [3] | Ch | |
- | |||||
1- | |||||
2- | |||||
3- | |||||
4- : [1] "" [2] | |||||
5- | |||||
6- | |||||
7- | |||||
( ).
1. [0] () .
2. i i + 1, [1]. , " ".
(): . . , A[i] [i+1], .. :
For i:= A[0] DownTo 1 Do Begin A[i+l]:= A[i+l] + (Longint(A[i]) * 10) Div Osn; A[i]:= (LongInt(A[i]) * 10) Mod Osn; End;23851674 6 " " . "" "7". "7" [1]. "" . .
i | [1] | [2] | [3] | ch |
( ch) "" [1] [0].
:
Procedure ReadLong(Var A: Tlong); Var ch: char; i: Integer; Begin FillChar(A, SizeOf(A), 0); Read(ch); While Not(ch In ['0'..'9']) Do Read(ch); { } While ch In ['0'..'9'] Do Begin For i:= A[0] DownTo 1 Do Begin {"" A[i] A[i+l]} A[i+l]:= A[i+l] + (LongInt(A[i]) * 10) Div Osn; A[i]:= (LongInt(A[i]) * 10) Mod Osn End; A[1]:= A[l] + Ord(ch) - Ord('0'); { [1]} If A[A[0]+1] > 0 Then Inc(A[0]); { , } Read(ch) End End;. "" .
, . "" , "" , , . . "" 128400583274 :
|
|
A[0] | A[1] | A[2] | A[3] |
"" 0058, . , . :
Procedure WriteLong(Const A: Tlong); Var ls, s: String; i: Integer; Begin Str(Osn Div 10, Is); Write(A[A[0]]; { } For i:= A[0] - l DownTo 1 Do Begin Str(A[i], s); While Length(s) < Length(Is) Do s:= '0' + s; { } Write(s) End; WriteLn End;. , "" .
"", , "" . . SumLongTwo.
"" :
Var A, B, C: Tlong; Begin Assign(Input, 'Input.txt'); Reset(Input); ReadLong(A); ReadLong(B); Close(Input); SumLongTwo(A, B, C); Assign(Output, 'Output.txt'); Rewrite(Output); WriteLong(C); Close(Output) End.. = 870613029451, = 3475912100517461.
i | A[i] | B[i] | C[1] | C[2] | C[3] | C[4] |
, . "" " ".
: = 3476782713546912.
"" .
Procedure SumLongTwo(A, B: Nlong; Var C: Tlong); Var i, k: Integer; Begin FillChar(C, SizeOf (C), 0); If A[0] > B[0] Then k:= A[0] Else k: =B[0]; For i:= l To k Do Begin [i+1]:= (C[i] + A[i] + B[i]) Div Osn; C[i]:= (C[i] + A[i] + B[i]) Mod Osn { ?} End; If C[k+l] = 0 Then C[0]:= k Else C[0]:= k + l End;. "" ( = , < , > , <= , >= ).
Function Eq(A, B: TLong): Boolean; Var i: Integer; Begin Eq:= False; If A[0] <> B[0] Then Exit Else Begin i:= l; While (i <= A[0]) And (A[i] = B[i]) Do Inc(i); Eq:= i = A[0] + l End End;> .
Function More(A, B: Tlong): Boolean; Var i: Integer; Begin If A[0] < B[0] Then More:= False Else If A[0] > B[0] Then More:= True Else Begin i:= A[0]; While (i > 0) And (A[i] = B[i]) Do Dec(i); If i = 0 Then More:= False Else If A[i] > B[i] Then More:= True Else More:=False End End;Eq More.
Function Less(A, B: Tlong): Boolean; {A < B} Begin Less:= Not(More(A, B) Or Eq(A, B)) End; Function More_Eq(A, B: Tlong): Boolean; {A >= B} Begin More_Eq:= More(A, B) Or Eq(A, B) End; Function Less_Eq(A, B: Tlong): Boolean; {A <= B} Begin Less_Eq:= Not More(A, B) End;, , . , 0, , 1, , 2 . . ? . 56784, 634. 2 , , , . . 56700, 567 2 "", . :
|
|
. . LongInt.
.
Procedure Mul(Const A: TLong; Const : Longlnt; Var : TLong); Var i: Integer; { - } Begin FillChar (, SizeOf(), 0); If K = 0 Then Inc([0]){ } Else Begin For i:= l To A[0] Do Begin C[i+l]:= (LongInt(A[i]) * K + C[i]) Div Osn; C[i]:= (LongInt(A[i])* K + C[i]) Mod Osn End; If C[A[0]+1] > 0 Then C[0]:= A[0] + 1 Else C[0]:= A[0] { } End End;.
, , . .
: , , , . "" .
, "" . , 9 11 1 , 10000 9 .
Procedure Sub (Var A: TLong; Const B: TLong; Const sp: Integer); Var i, j: Integer; { sp, } Begin For i:= l To B[0] Do Begin Dec(A[i+sp], B[i]); j: = i;{*} { } while (A[j+sp] < 0) and (j <= A[0]) Do Begin{*} Inc(A[j+sp], Osn); Dec(A[j+sp+l]); Inc(j); {*} end; {*} { . , *, , , , . " "} {If A[i+sp]<0 Then Begin Inc(A[i+sp], Osn); Dec (A[i+sp+l]);End;} End; i:= A[0]; While (i > l) And (A[i] = 0) Do Dec(i); A[0]:= i { } End;, , . 100000001000000000000, 2000073859998.
. , .. .
( ) . :
Procedure Long_Div_Long(Const , : TLong; Var Res, Ost: TLong); Begin FillChar(Res, SizeOf(Res), 0); Res[0]:= 1; FillChar(Ost, SizeOf(Ost), 0); 0st[0]:= 1; Case More(A, B, 0) Of 0: MakeDel(A, B, Res, Ost); { , , - "" } 1: Ost:=A; { } 2: Res[l]:= l; { } End; End;? . . ,
1000143123567 |73859998 - 73859998 |---------- --------- |13541 ( ) 261543143 - 221579994 ---------- 399631495 - 369299990 --------- 303315056 - 295439992 ---------- 78750647 - 73859998 -------- 4890649 ()? (1, 3, 5 ..), , , ... ? , . , . , , "". * 10, ( ) . , 564, 63 . , , . Down , Up , Ost .
|
|
Down | Up | = * ((Down + Up) Div 2) | Ost = 564 |
315 = 63 * ((0 + 10) Div 2) | C < Ost | ||
441 = 63 * ((5 + 10) Div 2) | C < Ost | ||
504 = 63 * ((7 + 10) Div 2) | C < Ost | ||
567 = 63 * ((8 + 10) Div 2) | C > Ost | ||
504 = 63 * ((8 + 9) Div 2) | C < Ost |
, (Up + Down) Div 2, Ost . (Down) , () , (Up), .
. 27856, 354. 10, 10000.
Down | Up | Ost = 27856 | |
C > Ost | |||
C > Ost | |||
C > Ost | |||
C > Ost | |||
C > Ost | |||
C > Ost | |||
C < Ost | |||
C > Ost | |||
C > Ost | |||
C > Ost | |||
C > Ost | |||
C > Ost | |||
C > Ost | |||
C < Ost |
78, 27856 27612, .. 244.
. "": (More) (Mul) .
Function FindBin(Var Ost: Tlong; Const : TLong; Const sp: Integer): Longint;Var Down, Up: Word; C: TLong;Begin Down:= 0;Up:= 0sn; { } While Up - l > Down Do Begin { . Up>Down. - .} Mul(, (Up + Down) Div 2, ); Case More(Ost, C, sp) Of 0: Down:= (Down + Up) Div 2; 1: Up:= (Up + Down) Div 2; 2: Begin Up:= (Up + Down) Div 2; Down:= Up End; End; End; Mul(B, (Up + Down) Div 2, C); If More (Ost, C, 0) = 0 Then Sub(Ost, C, sp) { } Else begin Sub (C, Ost, sp); Ost:= C end; FindBin:= (Up + Down) Div 2; { }End;, sp . , , 635 15. ? 63 15 , . . 4, . . 635, 35. . . . 2 5. , ( ) 42, 5. , 10, 10000? , , .
Procedure MakeDel(Const , : TLong; Var Res, Ost: TLong);Var sp: Integer;Begin Ost:= A; { } sp:= [0] - [0]; If More(, , sp) = l Then Dec(sp); {B * Osn > A, } Res[0]:= sp + l; While sp >= 0 Do Begin { } Res[sp + 1]:= FindBin(Ost, B, sp); Dec(sp) EndEnd;. : 10-15- , .
1- . , ( 1, 2, 3).
2- . ( 4).
3- . ( 5, 6).
4- . ( 7). , . . , . "" .
|
|
1. : "" ; "" ; "" ..
2. "" . ?
3. "" , , . "" .
, .. . . , , .
( . ": ".) n. n. , , n , (, b) n. ( .) , ( ) log2 n ( C * log2 n C; log2 n , 2, n).
.
k:= n; b:= 1; c:= a; {a n = b * (c k)} while k <> 0 do begin if k mod 2 = 0 then begin k:= k div 2; c:= c * c end else begin k:= k - 1; b:= b * c end end;( ) ( k , ), k .
( .., .. : . : . . 2- . .: , 1990. 416 .)
m, , . , .
1. m ( , ), . , m , () ; m , . .
2. , , , ; .
3. , , . A. , . x, ( 10 * a + x) x . x .
4. x A, , B. , b. y, y B. y .
4- . , .
.
. : 13'83'84 , , . 3, 32 < 13, 42 > 13. 9 13, 4. 4 , A = 483. , . . 3, a = 6. x, x 483. 7, 67 * 7 = 469 483, 68 * 8 = 544 483. , 7.
469 483, 14. , b = 1484. , .. 37, B = 74. y, y 1484. 2, 742 * 2 = 1484. 2 . 372.
, , 00. ; , .
(, ): 1) ; 2) ; 3) ; 4) ; 5) , (, , , , , ).
:
Type Tsifra = 0..9; Chislo = Array[1..1000] Of Tsifra;. .
(, ): 1) ; 2) ; 3) ; 4) ; 5) , (, , , , , ).
:
Type Tsifra = 0..9; Chislo = Record Znak: 0..1; {0 - "", 1 - ""} Ch: Array [1..1000] Of Tsifra End;. .