Problem Statement
Elly understands that working with infinite decimal fractions is going to be very difficult, so she first wants to find a good way to approximate floating point numbers with decimal representations that are finite. Your task is to help her in this mission. You will be given a
Given a fraction F = A/B, where 0 <= A < B, its quality of approximation with respect to number is calculated as follows:
- Let S be the decimal fraction (infinite or finite) representation of F.
- Let N be the number of digits after the decimal point in number. If number has trailing zeros, all of them are considered to be significant and are counted towards N.
- If S is infinite or the number of digits after the decimal point in S is greater than N, only consider the first N decimals after the decimal point in S. Truncate the rest of the digits without performing any kind of rounding.
- If the number of digits after the decimal point in S is less than N, append trailing zeroes to the right side until there are exactly N digits after the decimal point.
- The quality of approximation is the number of digits in the longest common prefix of S and number. The longest common prefix of two numbers is the longest string which is a prefix of the decimal representations of both numbers with no extra leading zeroes. For example, "3.14" is the longest common prefix of 3.1428 and 3.1415.
Definition
- Class:
- BestApproximationDiv2
- Method:
- findFraction
- Parameters:
- int, String
- Returns:
- String
- Method signature:
- String findFraction(int maxDen, String number)
- (be sure your method is public)
Constraints
- maxDen will be between 1 and 100,000, inclusive.
- number will contain between 3 and 50 characters, inclusive.
- number will consist of a digit '0', followed by a period ('.'), followed by one or more digits ('0'-'9').
Examples
42
"0.141592658"
Returns: "1/7 has 3 exact digits"
3 plus the current approximation yields an approximation of Pi.
3
"0.1337"
Returns: "0/1 has 1 exact digits"
Not a lot of options here.
80000
"0.1234567891011121314151617181920"
Returns: "10/81 has 8 exact digits"
1000
"0.42"
Returns: "3/7 has 3 exact digits"
This one can be represented in more than one way. Be sure to choose the one with the lowest denominator. Note that 21/50 is an even more accurate approximation (it is, in fact, exact), but it has the same number of matching digits (all three) and has a greater denominator.
100
"0.420"
Returns: "21/50 has 4 exact digits"
All trailing zeros in number are significant.
115
"0.141592658"
Returns: "16/113 has 7 exact digits"
A better approximation for the decimal part of Pi.
512
"0.000000000000"
Returns: "0/1 has 13 exact digits"
1000
"0.272727272727272727272727272727272727272727272727"
Returns: "3/11 has 49 exact digits"
100000
"0.99979980180378574789041150739232438957325345"
Returns: "99881/99901 has 32 exact digits"
99999
"0.00001"
Returns: "1/50001 has 6 exact digits"
100000
"0.00001"
Returns: "1/50001 has 6 exact digits"
100000
"0.999999999999"
Returns: "99999/100000 has 6 exact digits"
100000
"0.000099999999999999999999999999999999999999999999"
Returns: "1/10001 has 9 exact digits"
100000
"0.000009999999999999999999999999999999999999999999"
Returns: "0/1 has 6 exact digits"
9172
"0.618927954312334"
Returns: "739/1194 has 8 exact digits"
13016
"0.13893446066184"
Returns: "1609/11581 has 9 exact digits"
98926
"0.165754120014607177"
Returns: "5873/35432 has 10 exact digits"
38912
"0.6406189841439880877"
Returns: "8321/12989 has 9 exact digits"
35131
"0.74380880681"
Returns: "19763/26570 has 10 exact digits"
17422
"0.618211976295"
Returns: "7081/11454 has 9 exact digits"
58425
"0.4912508393967997693576658254416163355328253"
Returns: "10977/22345 has 10 exact digits"
38467
"0.75812574444429307787303825"
Returns: "27360/36089 has 10 exact digits"
57549
"0.05310675004549564821683148492070607056"
Returns: "1847/34779 has 9 exact digits"
29588
"0.11173004830129"
Returns: "1043/9335 has 10 exact digits"
96723
"0.0356667677191627276513995926532444279237"
Returns: "1528/42841 has 10 exact digits"
75536
"0.65281031552217482363035280722591085079053"
Returns: "33717/51649 has 10 exact digits"
43779
"0.32412908745"
Returns: "7583/23395 has 11 exact digits"
89529
"0.481435526892959"
Returns: "30653/63670 has 10 exact digits"
8171
"0.9182801848609300876356583948397"
Returns: "3225/3512 has 9 exact digits"
48997
"0.566144626825510151760"
Returns: "22485/39716 has 11 exact digits"
25785
"0.39219823402319898913514253892870148193597980"
Returns: "6505/16586 has 9 exact digits"
24510
"0.81033848015413735856908936069789415666667"
Returns: "4405/5436 has 9 exact digits"
55122
"0.603624588121"
Returns: "10625/17602 has 11 exact digits"
27491
"0.20892820552767878160958900072552148646"
Returns: "4039/19332 has 9 exact digits"
80251
"0.64419557473408815232466629049311995556059"
Returns: "11792/18305 has 10 exact digits"
70197
"0.4212779554034122982278583944"
Returns: "6593/15650 has 10 exact digits"
19371
"0.4679347881638"
Returns: "861/1840 has 9 exact digits"
55854
"0.2012770241037395972028670818303620284183"
Returns: "7597/37744 has 11 exact digits"
79772
"0.972282944827258473"
Returns: "23573/24245 has 10 exact digits"
76080
"0.0407590512098917330"
Returns: "2193/53804 has 10 exact digits"
87842
"0.62214326054"
Returns: "7704/12383 has 10 exact digits"
52802
"0.8639453823948513281646779641926315970261762"
Returns: "29991/34714 has 10 exact digits"
80980
"0.0117591817"
Returns: "576/48983 has 11 exact digits"
19897
"0.5649843253832706801195363153403179035291261701"
Returns: "5586/9887 has 9 exact digits"
47434
"0.8780956900135580177467074121835714"
Returns: "36981/42115 has 10 exact digits"
47730
"0.126633008138"
Returns: "2433/19213 has 10 exact digits"
27110
"0.5206728006"
Returns: "5541/10642 has 9 exact digits"
17827
"0.8887400599530995111233972330484392490574"
Returns: "10616/11945 has 9 exact digits"
7402
"0.1577941785788"
Returns: "578/3663 has 8 exact digits"
8517
"0.92842758409443584103340675"
Returns: "5993/6455 has 8 exact digits"
48298
"0.37658789771650132605744906119042197093331356959"
Returns: "2757/7321 has 10 exact digits"
32413
"0.025607209543256088157579"
Returns: "233/9099 has 11 exact digits"
68919
"0.21335290485733030321108187289230282558124988271"
Returns: "9884/46327 has 10 exact digits"
98584
"0.7198832933283402012"
Returns: "33309/46270 has 10 exact digits"
99238
"0.929130819202475810071693037304323"
Returns: "40931/44053 has 10 exact digits"
93370
"0.794980018508928085147361680865710283556"
Returns: "17705/22271 has 10 exact digits"
15278
"0.14145763463"
Returns: "1314/9289 has 9 exact digits"
81395
"0.6200651619735006518272452258698"
Returns: "21125/34069 has 10 exact digits"
25240
"0.7852729763159895495252230872837541829689"
Returns: "6228/7931 has 9 exact digits"
69275
"0.4352915567902319878"
Returns: "17998/41347 has 10 exact digits"
98617
"0.0286814764987386280980"
Returns: "2018/70359 has 11 exact digits"
98083
"0.201038733145612191804774119810"
Returns: "14206/70663 has 12 exact digits"
57270
"0.32978011"
Returns: "6404/19419 has 9 exact digits"
24763
"0.3091876840379622730730736467401244"
Returns: "1336/4321 has 9 exact digits"
4907
"0.0395711003318866479448557569568547357671687"
Returns: "155/3917 has 44 exact digits"
41477
"0.97424025591379745769845946628504082835"
Returns: "11573/11879 has 39 exact digits"
11910
"0.6210866057019903"
Returns: "5773/9295 has 17 exact digits"
27441
"0.6524317912218268"
Returns: "550/843 has 17 exact digits"
44336
"0.96422494125273478648407"
Returns: "23799/24682 has 24 exact digits"
57214
"0.894353369763205828"
Returns: "491/549 has 19 exact digits"
33476
"0.21199119911991199119911991199119"
Returns: "1927/9090 has 33 exact digits"
79581
"0.9109475267087478799111748352013428686331765"
Returns: "52098/57191 has 44 exact digits"
73372
"0.2176248108925869894"
Returns: "2877/13220 has 20 exact digits"
53660
"0.62094155844155844155844155844155"
Returns: "765/1232 has 33 exact digits"
21494
"0.686157117278424350940017905"
Returns: "12263/17872 has 28 exact digits"
87056
"0.47009345794392"
Returns: "503/1070 has 15 exact digits"
74811
"0.3210181580848931260343581"
Returns: "13772/42901 has 26 exact digits"
44372
"0.5918419052444894"
Returns: "2336/3947 has 17 exact digits"
3415
"0.1873767258382642998027613412228796844181459"
Returns: "95/507 has 44 exact digits"
94278
"0.33965632"
Returns: "1522/4481 has 9 exact digits"
59923
"0.13319661071833342328242214906"
Returns: "2468/18529 has 30 exact digits"
34618
"0.936594202898550724637681"
Returns: "517/552 has 25 exact digits"
82162
"0.567176560374290738958755"
Returns: "17093/30137 has 25 exact digits"
63217
"0.2695081967213"
Returns: "411/1525 has 14 exact digits"
24689
"0.5195467183418"
Returns: "12333/23738 has 14 exact digits"
79173
"0.98250056342882899603611247365141652636184062255"
Returns: "74111/75431 has 48 exact digits"
70587
"0.59505530253741054001301236174365647364996"
Returns: "4573/7685 has 42 exact digits"
13180
"0.73997821350762527233115468409586056"
Returns: "6793/9180 has 36 exact digits"
36081
"0.0752759675488761803431"
Returns: "566/7519 has 23 exact digits"
50188
"0.7273240105697"
Returns: "24497/33681 has 14 exact digits"
27875
"0.798645013450234133705290425425924080"
Returns: "8016/10037 has 37 exact digits"
65469
"0.704744525547445255474452554744525547445"
Returns: "1931/2740 has 40 exact digits"
12099
"0.3366159355416293643688451208594449"
Returns: "376/1117 has 35 exact digits"
27810
"0.8070713809206137424949966644429619746497665110"
Returns: "6049/7495 has 47 exact digits"
55554
"0.398797734459154244414329"
Returns: "11477/28779 has 25 exact digits"
76250
"0.900650075"
Returns: "13716/15229 has 10 exact digits"
6732
"0.705340699815837937384898710865561694290"
Returns: "383/543 has 40 exact digits"
51863
"0.259480696"
Returns: "1519/5854 has 10 exact digits"
37241
"0.13618587531631009"
Returns: "592/4347 has 18 exact digits"
68961
"0.5211327272134780200084726431"
Returns: "15992/30687 has 29 exact digits"
90254
"0.318529141071466792"
Returns: "14882/46721 has 19 exact digits"
80270
"0.4997191565588329057428688537033382417682510"
Returns: "32918/65873 has 44 exact digits"
24828
"0.65424979817783415984"
Returns: "5673/8671 has 21 exact digits"
90368
"0.77611137172659289"
Returns: "56251/72478 has 18 exact digits"
99977
"0.00058286134235501324108919045627906387400058"
Returns: "46/78921 has 45 exact digits"
78041
"0.58433079434167573449401523394994"
Returns: "537/919 has 33 exact digits"
52549
"0.82138526826311003334"
Returns: "10839/13196 has 21 exact digits"
8726
"0.10144927536231884057971014492"
Returns: "7/69 has 30 exact digits"
55255
"0.0355531971345184399044839479"
Returns: "134/3769 has 29 exact digits"
87473
"0.4873304782298358315488936473"
Returns: "2731/5604 has 29 exact digits"
81767
"0.30067047016199558572439928372"
Returns: "7220/24013 has 30 exact digits"
27640
"0.427052785923753665689149560117302052785923"
Returns: "1165/2728 has 43 exact digits"
87295
"0.9467016605259173270075203149447332559430676828"
Returns: "18757/19813 has 47 exact digits"
48498
"0.32833353017597731372741"
Returns: "2780/8467 has 17 exact digits"
44559
"0.19457615637700793497193728436810528353009483259"
Returns: "8043/41336 has 26 exact digits"
12575
"0.46418402205844323765192655805534005689164"
Returns: "1957/4216 has 8 exact digits"
81449
"0.30790927253496298037372194137373369373"
Returns: "2620/8509 has 28 exact digits"
4675
"0.182266009852216748768472906403940886699507379"
Returns: "37/203 has 44 exact digits"
71759
"0.570346996695"
Returns: "27647/48474 has 9 exact digits"
36635
"0.646241124"
Returns: "17201/26617 has 10 exact digits"
93850
"0.0457983771145647091184146237106312749277"
Returns: "333/7271 has 24 exact digits"
88064
"0.841890367989215672566734500771"
Returns: "64951/77149 has 18 exact digits"
53299
"0.223230876432331990328"
Returns: "11533/51664 has 18 exact digits"
42727
"0.4131731821"
Returns: "5263/12738 has 10 exact digits"
84127
"0.040621714962"
Returns: "541/13318 has 11 exact digits"
29247
"0.330873644893867998815705566183838935957"
Returns: "3632/10977 has 15 exact digits"
54200
"0.638610885171694309853139654135870"
Returns: "18058/28277 has 20 exact digits"
80581
"0.5212874312487268282735976777347728661641882"
Returns: "2559/4909 has 21 exact digits"
2758
"0.792682926829268292682926829268292672"
Returns: "65/82 has 35 exact digits"
65085
"0.800731780299764919996966709638280"
Returns: "45082/56301 has 10 exact digits"
12588
"0.473855030652722683014785430941208896501"
Returns: "1314/2773 has 32 exact digits"
45023
"0.341266512895785279932899969031243447263577269"
Returns: "3255/9538 has 26 exact digits"
43846
"0.410276438760452533202164289227742252"
Returns: "12081/29446 has 10 exact digits"
67667
"0.587024377166274104287547155358855209590011"
Returns: "30655/52221 has 31 exact digits"
89397
"0.628603032077558722102834478495"
Returns: "9661/15369 has 22 exact digits"
87516
"0.448562084533077387935018307205473922007749457"
Returns: "25237/56262 has 31 exact digits"
7378
"0.819248826291069812206"
Returns: "349/426 has 14 exact digits"
21726
"0.2888446215039442231075697"
Returns: "145/502 has 11 exact digits"
52943
"0.9705317114420243433696348494554772581"
Returns: "1515/1561 has 9 exact digits"
87474
"0.61636409480584972264246081780131114"
Returns: "4889/7932 has 25 exact digits"
7312
"0.35064578180818906292937610225336630942"
Returns: "1276/3639 has 25 exact digits"
13885
"0.7087496438021"
Returns: "7590/10709 has 9 exact digits"
63781
"0.092734733756717147044455300"
Returns: "1921/20715 has 10 exact digits"
81871
"0.594873150105708245233"
Returns: "2251/3784 has 20 exact digits"
3102
"0.7668918918908"
Returns: "227/296 has 12 exact digits"
26880
"0.6339525000520878548485111554822467228"
Returns: "6621/10444 has 9 exact digits"
94216
"0.3979401507393479847538723542291"
Returns: "4907/12331 has 10 exact digits"
44801
"0.45505778966472432449135543031808195"
Returns: "4764/10469 has 16 exact digits"
48301
"0.885265903736115775930663076405250"
Returns: "21041/23768 has 17 exact digits"
44169
"0.949226755"
Returns: "10189/10734 has 9 exact digits"
31197
"0.9353734217847206"
Returns: "4371/4673 has 16 exact digits"
69996
"0.91565106743955888590404251378481549554644422"
Returns: "32382/35365 has 22 exact digits"
85587
"0.20299298519085869056897895"
Returns: "6511/32075 has 13 exact digits"
4029
"0.59782607695652173913043"
Returns: "55/92 has 8 exact digits"
3440
"0.575727676269018253576714356191415885545140601"
Returns: "1167/2027 has 10 exact digits"
31867
"0.94760857842120545898531"
Returns: "22844/24107 has 20 exact digits"
41800
"0.92095996718060920994153"
Returns: "26939/29251 has 23 exact digits"
10960
"0.6936538056082648113007644317942230655703141471"
Returns: "3290/4743 has 22 exact digits"
94241
"0.42815716437043398075"
Returns: "34402/80349 has 18 exact digits"
31956
"0.1376730165619154508043396932285821"
Returns: "3183/23120 has 9 exact digits"
71539
"0.960522386886894752557715577884"
Returns: "61119/63631 has 27 exact digits"
25651
"0.4440343262971"
Returns: "4812/10837 has 10 exact digits"
60924
"0.4876482624390730780344850531499010197461447607"
Returns: "29314/60113 has 18 exact digits"
100
"0.909"
Returns: "10/11 has 4 exact digits"
99991
"0.999979998599901993139519766383646855279869590871"
Returns: "49995/49996 has 10 exact digits"
100000
"0.314159265358979323846264338327950288419716939937"
Returns: "71/226 has 8 exact digits"
45234
"0.2341235423123234234"
Returns: "4859/20754 has 10 exact digits"
97567
"0.6876098797632487238476328437629876"
Returns: "23858/34697 has 10 exact digits"
99999
"0.599067439767013706591197847890228232979542625952"
Returns: "17473/29167 has 10 exact digits"
100000
"0.4200"
Returns: "21/50 has 5 exact digits"
100000
"0.0000000083458734652746"
Returns: "0/1 has 9 exact digits"
10000
"0.98493849148959862134119850850968234150985123095"
Returns: "4643/4714 has 8 exact digits"
100000
"0.43489090314967484371609146097601981960471390493"
Returns: "4365/10037 has 10 exact digits"
100000
"0.141592658"
Returns: "4783/33780 has 10 exact digits"
99999
"0.1234567899998777776666666666"
Returns: "10/81 has 8 exact digits"
98
"0.1337"
Returns: "2/15 has 4 exact digits"
7
"0.141592658"
Returns: "1/7 has 3 exact digits"
100000
"0.448305799387298197748392834724989823468"
Returns: "18073/40314 has 10 exact digits"
100000
"0.123456789"
Returns: "10/81 has 8 exact digits"
100000
"0.141592658979323846264338326950288419716931418591"
Returns: "4783/33780 has 10 exact digits"
100
"0.0000000067860687"
Returns: "0/1 has 9 exact digits"
89329
"0.10290340007656086753"
Returns: "6089/59172 has 10 exact digits"
97567
"0.68760987976324872398757832998476328437629876"
Returns: "23858/34697 has 10 exact digits"
100000
"0.222222222222222222222222222222222222222222222222"
Returns: "2/9 has 49 exact digits"
100000
"0.123456789123456789123456789123456789"
Returns: "10/81 has 8 exact digits"
100000
"0.123213213213123123345435354"
Returns: "4103/33300 has 13 exact digits"
100000
"0.4567876545678765456787652345687906758495"
Returns: "13705/30003 has 25 exact digits"
20
"0.333333333333333333333333333333333333333333333333"
Returns: "1/3 has 49 exact digits"
100000
"0.254654864646546784321346546546546456"
Returns: "21117/82924 has 11 exact digits"
99999
"0.45689894566568897312323156448897897895"
Returns: "6583/14408 has 10 exact digits"
100000
"0.12345678910111213134343434151617181920"
Returns: "10/81 has 8 exact digits"
99999
"0.123637461672645389056432785432123456783929239596"
Returns: "12284/99355 has 11 exact digits"
100000
"0.197367625619736762561973676256197367625677"
Returns: "9792/49613 has 10 exact digits"
100000
"0.000000000000000000000000000000000000000000000001"
Returns: "0/1 has 48 exact digits"
100000
"0.032794242021506118715156117852149748865146624782"
Returns: "1900/57937 has 49 exact digits"
100000
"0.948576017495810295639485064104982057391749059938"
Returns: "33074/34867 has 11 exact digits"
100
"0.0"
Returns: "0/1 has 2 exact digits"
100000
"0.1234567891234567899876543223456789765213567"
Returns: "10/81 has 8 exact digits"
100000
"0.784829027240752875472985719875981759187985719869"
Returns: "5256/6697 has 10 exact digits"
100000
"0.618726487192648172648716348971648761284361183643"
Returns: "22203/35885 has 10 exact digits"
99999
"0.123456789012345678901234567890123456000"
Returns: "10/81 has 8 exact digits"
100000
"0.123451234512345123451234512345123451234512345123"
Returns: "4115/33333 has 49 exact digits"
99999
"0.98765987659876598765987659876599"
Returns: "98765/99999 has 32 exact digits"
100000
"0.999999999999999999999999999999999999999999999999"
Returns: "99999/100000 has 6 exact digits"