【问题标题】:Decimal expansion program running very slow for large inputs大输入的十进制扩展程序运行速度非常慢
【发布时间】:2013-03-02 16:42:36
【问题描述】:

我正在编写一个程序来计算数字 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());
    }
}

【问题讨论】:

  • deccases 是什么?
  • dec 是您要扩展的小数位数,如果您想以多种方式打印数字的小数扩展,例如,如果我输入 2 4 6 它会打印出数字扩展到小数点后 4 位,然后它会再次打印出来 扩展到第 6 位

标签: java performance algorithm math bigdecimal


【解决方案1】:

无需创建一长串数字,只需打印出数字即可。例如:

        while (dec > 52) {
            System.out.print(repNum);
            dec -= 51;
        }
        pw.println(repNum.substring(0, dec - 1));

通过连接在循环中创建长字符串对性能非常不利,因为字符串是不可变的。该程序花费所有时间创建新字符串,一个比另一个长,并将字符从旧的复制到新的,基本上实现Schlemiel the Painter's algorithm

【讨论】:

  • 他也可以使用StringBufferStringBuilder
  • 谢谢,我总是忘记这些字符串是不可变的并且超级慢
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2014-08-28
相关资源
最近更新 更多