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

标签 java console-application

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

这是我的代码:

public class Main {

    public static int amount = 509;

    public static long m;
    public static long n;
    public static double o;
    public static double p;
    public static int q = 1;
    public static boolean prime = true;
    public static boolean mersennePrime = true;

    public static void prime() {
        if (m % 2 == 0) prime = false;
        for (int i = 3; i * i <= m; i += 2) {
            if (m % i == 0) prime = false;
        }

        if (m == 1) prime = false;
        if (m == 2) prime = true;
    }

    public static void mersennePrime() {
        if (prime) {
            o = Math.pow(2, m) - 1;
            for (int i = 3; i * i <= o; i += 2) {
                if (o % i == 0) {
                    mersennePrime = false;
                    break;
                }
            }
        }
        else mersennePrime = false;
    }

    public static void perfectNumber() {
        if (mersennePrime) {
            p = (o * (o + 1)) / 2;
            System.out.println(q + ". " + m + ": mersenne prime = " + o + ", perfect number = " + p);
            q++;
        }
    }

    public static void reset() {
        prime = true;
        mersennePrime = true;
        n = 0;
        o = 0;
        p = 0;
    }

    public static void main(String[] args) {
        for (int i = 2; i <= amount; i++) {
            m = i;
            prime();
            mersennePrime();
            perfectNumber();
            reset();
        }
    }
}

这是我的输出:

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

最佳答案

问题是 if (o % i == 0)mersennePrime方法。 o是 double 型变量。 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可以更大,整数将无法跟上它。

关于java - 程序结束,但控制台仍然挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39319916/

相关文章:

c# - C#代码中{0}\\{1}的含义

java - RESTful API 客户端如何保存 oAuth token 以供将来的请求使用?

JavaFX - 从不同线程调用 GUI 方法

java - 在父类中使用有关子类的方法是一种不好的做法吗?

php - 在终端中运行 php 脚本,直到按下一个键

c# - 存储上次应用程序运行的日期/时间

c# - 非泛型方法 'IServiceProvider.GetService(Type)' 不能与类型参数一起使用

java - Java中字符串相减2等于null

java - 在 Java 中创建 CSV 文件

c# - 如何在 C# 中将 csv 分隔符从 ","更改为 ": "