程序结束,但控制台仍然挂起

时间:2016-09-04 18:00:54

标签: java console-application

该程序用于生成完美数字。我的代码似乎没问题,但出于某种原因它会在第7个完美数字之后停止工作。仔细看看控制台之后,我意识到我的程序没有终止。

这是我的代码:

/**
 * Convert a JSON string to pretty print version
 * @param jsonString
 * @return
 */
public static String toPrettyFormat(String jsonString) 
{
    JsonParser parser = new JsonParser();
    JsonObject json = parser.parse(jsonString).getAsJsonObject();

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String prettyJson = gson.toJson(json);

    return prettyJson;
}

这是我的输出:

  1. 2:mersenne prime = 3.0,完美数= 6.0
  2. 3:mersenne prime = 7.0,完美数字= 28.0
  3. 5:mersenne prime = 31.0,完美数= 496.0
  4. 7:mersenne prime = 127.0,完美数字= 8128.0
  5. 13:mersenne prime = 8191.0,完美数= 3.3550336E7
  6. 17:mersenne prime = 131071.0,完美数字= 8.589869056E9
  7. 19:mersenne prime = 524287.0,完美数字= 1.37438691328E11

1 个答案:

答案 0 :(得分:1)

if (o % i == 0)方法中的问题是mersennePrime o是双类型变量。 double对其执行模运算(%)不准确。在此程序中,每个素数的o值都在增加。例如:对于数字61,o的值为2.305843009213694E18。并且对它进行模运算,我认为它不会有太多准确性。

实际上你的程序一直在运行(我已经达到了第131个数字,大约需要10分钟)。但是在第7个完美数字之后没有打印任何内容,因为if (o % i == 0)没有准确执行并且让所有内容都进入其中。因此,即使mersennePrime应该为真的数字也会变错。由于没有mersennePrime为真,因此在第7个完整数字之后找不到完美数字。

我认为使用BigDecimal代替double可以解决您的问题。

另外,请注意for (int i = 3; i * i <= o; i += 2)因为i * i本身是一个整数。由于o可能更大,整数将无法跟上它。