/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 ĠLicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . datetime . test . math Ċ import Ġkotlin . random .* Ċ import Ġkotlin . test .* Ċ import Ġkotlinx . datetime .* Ċ Ċ class ĠMultiply And Divide Test Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġmul Div ( a : ĠLong , Ġb : ĠLong , Ġm : ĠLong ): ĠPair < Long , ĠLong > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmultiply And Divide ( a , Ġb , Ġm ). run Ġ{ Ġq Ġto Ġr Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsmall () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 L Ġto Ġ 3 L , Ġmul Div ( 5 L , Ġ 1 5 L , Ġ 1 8 L )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 5 L Ġto Ġ 0 L , Ġmul Div ( 5 L , Ġ 1 2 L , Ġ 4 L )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsmall Negative () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 L Ġto Ġ 3 L , Ġmul Div (- 5 L , Ġ- 1 5 L , Ġ 1 8 L )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 9 7 3 0 8 3 2 3 L Ġto Ġ 4 7 5 1 4 4 0 6 7 L , Ġmul Div (- 1 0 5 7 5 8 8 5 5 4 , Ġ- 1 0 9 5 5 7 1 6 5 3 , Ġ 1 9 3 9 8 0 8 9 6 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlarge () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= ĠLong . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmul Div ( l Ġ- Ġ 1 , Ġl Ġ- Ġ 2 , Ġl ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 4 L Ġto Ġ 2 L , Ġresult ) Ġ// Ġhttps :// www . w ol fram alpha . com / input /? i = floor % 2 8 % 2 8 2 % 5 E 6 3 +- + 2 % 2 9 + * +% 2 8 2 % 5 E 6 3 +- + 3 % 2 9 +% 2 F +% 2 8 2 % 5 E 6 3 +- 1 % 2 9 % 2 9 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlarge Negative () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr 1 Ġ= Ġmul Div ( Long . MIN _ VALUE , ĠLong . MAX _ VALUE , ĠLong . MAX _ VALUE ) ĊĠĠĠĠĠĠĠ Ġval Ġr 2 Ġ= Ġmul Div ( Long . MAX _ VALUE , ĠLong . MIN _ VALUE , ĠLong . MAX _ VALUE ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Long . MIN _ VALUE Ġto Ġ 0 L , Ġr 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( r 1 , Ġr 2 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġr 3 Ġ= Ġmul Div ( Long . MIN _ VALUE , ĠLong . MAX _ VALUE Ġ- Ġ 1 , ĠLong . MAX _ VALUE ) ĊĠĠĠĠĠĠĠ Ġval Ġr 4 Ġ= Ġmul Div ( Long . MAX _ VALUE Ġ- Ġ 1 , ĠLong . MIN _ VALUE , ĠLong . MAX _ VALUE ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals (- 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 6 Ġto Ġ- 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 6 , Ġr 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( r 3 , Ġr 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhalf Large () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= ĠLong . MAX _ VALUE Ġ/ Ġ 2 Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmul Div ( l Ġ- Ġ 2 , Ġl Ġ- Ġ 3 , Ġl ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 6 1 1 6 8 6 0 1 8 4 2 7 3 8 7 8 9 9 L Ġto Ġ 6 L , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrandom Product Fits In Long () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠRandom . nextInt (). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠRandom . nextInt (). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠRandom . nextInt ( 1 , ĠInt . MAX _ VALUE ). to Long () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ a , Ġ$ b , Ġ$ c : Ġ${ a Ġ* Ġb Ġ/ Ġc }, Ġ${ a Ġ* Ġb Ġ% Ġc }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( q , Ġr ) Ġ= Ġmul Div ( a , Ġb , Ġm ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ d , Ġ$ r ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( a Ġ* Ġb Ġ/ Ġm , Ġq ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( a Ġ* Ġb Ġ% Ġm , Ġr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnear Int Boundary () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( d , Ġr ) Ġ= Ġmul Div (( 1 L Ġshl Ġ 3 2 ) Ġ+ Ġ 1 6 9 3 , Ġ( 1 L Ġshl Ġ 3 2 ) Ġ- Ġ 3 , Ġ( 1 L Ġshl Ġ 3 3 ) Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 _ 1 4 7 _ 4 8 4 _ 4 9 3 , Ġd ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 _ 1 4 7 _ 4 7 9 _ 4 1 4 , Ġr ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlarge Overflow s () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Fails With < Arithmetic Exception > Ġ{ Ġmul Div ( Long . MIN _ VALUE , ĠLong . MIN _ VALUE , ĠLong . MAX _ VALUE ) Ġ} ĊĠĠĠĠĠĠĠ Ġassert Fails With < Arithmetic Exception > Ġ{ Ġmul Div ( Long . MAX _ VALUE , Ġ 4 , Ġ 3 ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ