TopCoder problem "Decimal" used in TCI '02 Round 1 B (Division I Level Three)



Problem Statement

    

A rational number is a number which can be expressed as a ratio of two integers. In addition, all rational numbers can be expressed as a decimal number with some repeating periodic part (in some cases the repeating part is 0). For example 1/7 = 0.1428571428571428... with 142857 repeating itself infinitely. Other fractions have some finite number of non-repeating digits before the periodic part begins. For example, 1/6 = 0.166666... starts with a 1 and then settles into repeating 6's.

Your task is to write a class Decimal with a method find that takes four int's: lower, upper, lowerLength, and upperLength. Your method must find all integers n between lower and upper, inclusive, where the repeating portion of the decimal representation of 1/n has between lowerLength and upperLength digits, inclusive. You should return all of the numbers you find in a int[] sorted in increasing order.

 

Definition

    
Class:Decimal
Method:find
Parameters:int, int, int, int
Returns:int[]
Method signature:int[] find(int lower, int upper, int lowerLength, int upperLength)
(be sure your method is public)
    
 

Constraints

-lower and upper will be between 1 and 1000000, inclusive.
-upper will be greater than or equal to lower.
-The difference between upper and lower will be at most 100.
-lowerLength and upperLength will be between 1 to 1000000, inclusive.
-upperLength will be greater than or equal to lowerLength.
 

Examples

0)
    
1
10
1
1
Returns: { 1,  2,  3,  4,  5,  6,  8,  9,  10 }
1/1 = 1.00000...
1/2 = 0.50000...
1/3 = 0.33333...
1/4 = 0.25000...
1/5 = 0.20000...
1/6 = 0.16666...
1/8 = 0.12500...
1/9 = 0.11111...
1/10 = 0.10000...
Thus, all of the numbers other than 7 eventually settle into a repeating sequence of exactly 1 digit.
1)
    
55
56
1
10
Returns: { 55,  56 }
1/55 = 0.01818... (18 is repeating)
1/56 = 0.017857142857142... (857142 is repeating)
Both of these numbers have between 1 and 10 digits in its repeating part.
2)
    
200
300
10
20
Returns: { 204,  209,  212,  228,  237,  247,  248,  255,  265,  266,  272,  279,  285 }
3)
    
999983
999983
999982
999982
Returns: { 999983 }
The repeating part of 1/999983 is 999982 digits long!

Problem url:

http://www.topcoder.com/stat?c=problem_statement&pm=1016

Problem stats url:

http://www.topcoder.com/tc?module=ProblemDetail&rd=4325&pm=1016

Writer:

lars2520

Testers:

alexcchan , brett1479

Problem categories:

Advanced Math