我正在编写一个程序来计算数字的小数扩展103993/33102
我想根据用户输入的数字打印出所有尾随小数。它可以快速运行所有数量最多10^5
但如果输入10^6
编程大约需要 5 分钟才能打印出答案。我怎样才能加快速度?我尝试了两种不同的方法,一种使用BigDecimal
另一个使用字符串,但两者都没有有效地工作。
public static void main(String[] args) throws NumberFormatException,
IOException {
// BigDecimal num1 = new BigDecimal(103993);
// BigDecimal num2 = new BigDecimal(33102);
String repNum = "415926530119026040722614947737296840070086399613316";
// pw.println(num.toString());
String sNum = "3.1";
// pw.println(repNum.length());
int cases = Integer.parseInt(br.readLine());
int dec;
for (int i = 0; i < cases; i++) {
sNum = "3.1";
dec = Integer.parseInt(br.readLine());
if (dec == 0)
pw.println("3");
else if (dec <= 52) {
sNum += repNum.substring(0, dec - 1);
pw.println(sNum);
} else {
while (dec > 52) {
sNum += repNum;
dec -= 51;
}
sNum += repNum.substring(0, dec - 1);
pw.println(sNum);
}
// pw.println(num1.divide(num2, dec,
// RoundingMode.FLOOR).toString());
}
}
无需创建一长串数字,只需打印出数字即可。例如:
while (dec > 52) {
System.out.print(repNum);
dec -= 51;
}
pw.println(repNum.substring(0, dec - 1));
通过连接在循环中创建长字符串对于性能来说确实很糟糕,因为字符串是不可变的。该程序花费所有时间创建新字符串,一个比另一个长,并将字符从旧字符串复制到新字符串,本质上是实现画家施莱米尔算法 http://en.wikipedia.org/wiki/Schlemiel_the_Painter%27s_algorithm.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)