level 5
javran
楼主
// Object = High Precision Arithmetic// Author = Javran Cheng// Finish = False// HPAdd = Finished// HPSub = Finished// HPMulLow = None// HPDivLow = None// HPMulHigh = None// HPDivHigh = NoneProgram HPA;ConstFileIn = 'I.Txt' ;FileOut = 'O.Txt' ;LengthMax = 1000 ;TypeTIndex = Integer ;HNum = Array [ 0 .. LengthMax ] of TIndex ;Num = RecordS : HNum ;Len : TIndex ;End;VarKStr : AnsiString ;A , B : Num ;Res : Num ;Limited : Boolean ;// HPA Member Base :// The Part Of HPAdd :Procedure HPAdd ( A , B : Num ; Var Res : Num ) ; Forward ;// The Part Of HPSub :Procedure HPSub ( A , B : Num ; Var Res : Num ) ; Forward ;Procedure HPSSub ( A , B : Num ; Var Res : Num ) ; Forward ;// The Part Of I/O Operation :Procedure FileOperation ; Forward ;Procedure FileClose ; Forward ;Procedure NumRead ( NIn : AnsiString ; Var N : Num ) ; Forward ;Procedure NumOut ( N : Num ) ; Forward ;// The Part Of Main :Procedure Main ; Forward ;// The Part Of Controling DetailsProcedure Check ( Var N : Num ) ; Forward ;Procedure Clear ; Forward ;Function Match ( A , B : Num ): TIndex ; Forward ;Function Max ( A , B : TIndex ) : TIndex ; Forward ;Function Match ( A , B : Num ): TIndex ;VarR : TIndex ;Mt : TIndex ;I : TIndex ;BeginR := A.Len - B.Len ;If ( R <> 0 ) ThenIf ( R > 0 ) ThenBeginMatch := 1 ;Exit ;EndElseBeginMatch := -1 ;Exit ;End ;Mt := 0 ;For I := A.Len DownTo 1 DoIf ( A.S[ I ] <> B.S[ I ] ) ThenBeginMt := A.S[ I ] - B.S[ I ] ;Break ;End;Match := Mt ;If ( Mt > 0 ) Then Match := 1 ;IF ( Mt < 0 ) ThenMatch := -1 ; End ;Function Max ( A , B : TIndex ) : TIndex ;BeginMax := A ;If ( A < B ) ThenMax := B ;End ;Procedure HPAdd ( A , B : Num ; Var Res : Num ) ;VarI : TIndex ;Len : TIndex ;BeginFillChar ( Res , SizeOf ( Res ) , 0 ) ;Len := Max ( A.Len , B.Len );For I := 1 To Len DoRes.S [I] := A.S [I] + B.S [I];For I := 1 To Len DoBeginInc ( Res.S [ I + 1 ] , Res.S [ I ] Div 10 );Res.S [ I ] := Res.S[ I ] Mod 10 ; End ;Check ( Res ) ;End ;Procedure HPSSub ( A , B : Num ; Var Res : Num ) ;VarLen : TIndex ;I : TIndex ;J : TIndex ;BeginLen := A.Len ;For I := 1 To Len DoRes.S[ I ] := A.S[ I ] - B.S[ I ];For I := 1 To Len DoIf ( Res.S[I] < 0 ) ThenBeginJ := 0;While ( Res.S[ I ] < 0 ) DoBeginInc ( Res.S[ I ] , 10 ) ;Inc ( J ) ;End ;Dec ( Res.S [ I + 1 ] , J ) ;End ;Check ( Res ) ;End ;Procedure HPSub ( A , B : Num ; Var Res : Num ) ;BeginFillChar ( Res , SizeOf ( Res ) , 0 );Limited := False ;If ( Match ( A , B ) = -1 ) ThenBeginHPSSub ( B , A , Res ) ;Limited := True ;End ElseIf ( Match ( A , B ) = 1 ) ThenHPSSub ( A , B , Res )ElseBeginRes.S[ 1 ] := 0 ;Res.Len := 1 ;Exit ;End;End ; Procedure Clear ;BeginFillChar ( A , SizeOf ( A ) , 0 ) ;FillChar ( B , SizeOf ( B ) , 0 ) ;FillChar ( Res , SizeOf ( Res ) , 0 ) ;Limited := False ;End ;Procedure FileOperation ;BeginAssign ( Input , FileIn ) ;Assign ( Output , FileOut ) ;Reset ( Input ) ;Rewrite ( Output );End ;Procedure Check ( Var N : Num ) ;VarI : TIndex ;BeginI := LengthMax ;While ( N.S[I] = 0 ) DoDec ( I ) ;If ( I <> N.Len ) ThenN.Len := I ;End ;Procedure NumRead ( NIn : AnsiString ; Var N : Num ) ;VarLen : TIndex ;I : TIndex ;BeginLen := Length ( NIn ) ;N.Len := Len ;For I := 1 To Len DoN.S [I] := Ord ( NIn [ Len - I + 1 ] ) - Ord ( '0' );Check ( N ) ;End;Procedure NumOut ( N : Num ) ;VarI : TIndex ;BeginIf Limited ThenWrite ( '-' ) ;For I := N.Len Downto 1 DoWrite ( N.S [I] );Writeln ;End ;Procedure Main ;BeginReadln ( KStr ) ;NumRead ( KStr , A ) ;Readln ( KStr ) ;NumRead ( KStr , B ) ;Writeln ( 'The Operation Number A is :' ) ;NumOut ( A ) ;Writeln ( 'The Operation Number B is :' ) ;NumOut ( B ) ;Writeln ( ' A + B =' ) ;HPAdd ( A , B , Res ) ;NumOut ( Res ) ;Writeln ( ' A - B =' ) ;HPSub ( A , B , Res ) ;NumOut ( Res ) ;End ; Procedure FileClose ;BeginClose ( Input ) ;Close ( Output ) ;End ;BeginClear ;FileOperation ;Main ;FileClose ;End.
2007年02月17日 11点02分
1