该程序用于生成完美数字。我的代码似乎没问题,但出于某种原因它会在第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;
}
这是我的输出:
答案 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
可能更大,整数将无法跟上它。