26 Reciprocal cycles - Project Euler

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"));
}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值