package xxx.xxx.xxx;
/*
* A unit fraction contains 1 in the numerator.
* The decimal representation of the unit fractions with denominators 2 to 10 are given:
1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1
* Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle.
* It can be seen that 1/7 has a 6-digit recurring cycle.
* Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.
*/
import java.math.BigDecimal;
public class ReciprocalCycles1 {
private void compute(BigDecimal supremum, int demicalFractions) {
BigDecimal d1 = new BigDecimal(1.0);
BigDecimal d2 = new BigDecimal(3.0);
BigDecimal dWithMaxcirculation = BigDecimal.ZERO;
BigDecimal result = BigDecimal.ZERO;
int maxcirculation = 0;
String circulation = "";
while (d2.compareTo(supremum) <= 0) {
String strResult = "";
try {
result = d1.divide(d2);
} catch (Exception e) {
result = d1.divide(d2, demicalFractions, BigDecimal.ROUND_DOWN);
// String strResult = result.toString().split("0.")[1];
strResult = result.toString().split("\\.")[1];
while (strResult.startsWith("0")) {
strResult = strResult.substring(1);
}
}
// System.out.println(strResult);
int beginIndex = 0;
int length = strResult.length()-1;
label:
while (beginIndex < strResult.length()-1) {
strResult = strResult.substring(beginIndex);
for (int range = 1; range <= strResult.length() - beginIndex; range++) {
String prefix = strResult.substring(0, range);
String tempResult = strResult;
int circulationCount = strResult.length() / range;
int count = 0;
while (tempResult.startsWith(prefix) && tempResult.length() >= prefix.length()) {
tempResult = tempResult.substring(range);
count++;
}
if (count>1 && count == circulationCount) {
if (maxcirculation < prefix.length()) {
// System.out.println(prefix);
maxcirculation = prefix.length();
circulation = prefix;
dWithMaxcirculation= d2;
}
// System.out.println("prefix" + prefix);
break label;
}
}
beginIndex++;
}
d2 = d2.add(BigDecimal.valueOf(1.0));
}
System.out.println("circulation " + circulation);
System.out.println("circulation.length " + circulation.length());
System.out.println("dWithMaxcirculation: "+dWithMaxcirculation);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
long startTime = System.currentTimeMillis();
ReciprocalCycles1 r1 = new ReciprocalCycles1();
r1.compute(BigDecimal.valueOf(1000.0), 2000);
long endTime = System.currentTimeMillis();
System.out.println("execution time " + (endTime - startTime + "ms"));
}
}
/*
* A unit fraction contains 1 in the numerator.
* The decimal representation of the unit fractions with denominators 2 to 10 are given:
1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1
* Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle.
* It can be seen that 1/7 has a 6-digit recurring cycle.
* Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.
*/
import java.math.BigDecimal;
public class ReciprocalCycles1 {
private void compute(BigDecimal supremum, int demicalFractions) {
BigDecimal d1 = new BigDecimal(1.0);
BigDecimal d2 = new BigDecimal(3.0);
BigDecimal dWithMaxcirculation = BigDecimal.ZERO;
BigDecimal result = BigDecimal.ZERO;
int maxcirculation = 0;
String circulation = "";
while (d2.compareTo(supremum) <= 0) {
String strResult = "";
try {
result = d1.divide(d2);
} catch (Exception e) {
result = d1.divide(d2, demicalFractions, BigDecimal.ROUND_DOWN);
// String strResult = result.toString().split("0.")[1];
strResult = result.toString().split("\\.")[1];
while (strResult.startsWith("0")) {
strResult = strResult.substring(1);
}
}
// System.out.println(strResult);
int beginIndex = 0;
int length = strResult.length()-1;
label:
while (beginIndex < strResult.length()-1) {
strResult = strResult.substring(beginIndex);
for (int range = 1; range <= strResult.length() - beginIndex; range++) {
String prefix = strResult.substring(0, range);
String tempResult = strResult;
int circulationCount = strResult.length() / range;
int count = 0;
while (tempResult.startsWith(prefix) && tempResult.length() >= prefix.length()) {
tempResult = tempResult.substring(range);
count++;
}
if (count>1 && count == circulationCount) {
if (maxcirculation < prefix.length()) {
// System.out.println(prefix);
maxcirculation = prefix.length();
circulation = prefix;
dWithMaxcirculation= d2;
}
// System.out.println("prefix" + prefix);
break label;
}
}
beginIndex++;
}
d2 = d2.add(BigDecimal.valueOf(1.0));
}
System.out.println("circulation " + circulation);
System.out.println("circulation.length " + circulation.length());
System.out.println("dWithMaxcirculation: "+dWithMaxcirculation);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
long startTime = System.currentTimeMillis();
ReciprocalCycles1 r1 = new ReciprocalCycles1();
r1.compute(BigDecimal.valueOf(1000.0), 2000);
long endTime = System.currentTimeMillis();
System.out.println("execution time " + (endTime - startTime + "ms"));
}
}