【问题标题】:Calculating primes with long (Java)用 long 计算素数(Java)
【发布时间】:2019-08-13 07:02:51
【问题描述】:

我想写一个小程序,它能够从欧拉数中找到前 10 位长素数。

第 99 位的数字是我正在搜索的数字,但是 isPrim() 方法没有正确响应。你知道出了什么问题吗?

我的代码

public class Main {

    public static final String e = "27182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966";


    public static void main(String[] args) {
        System.out.println(e);
        for (int i = 0; i < e.length() - 10; i++) {

            String str = e.substring(i, i + 10);

            long num = Long.parseLong(str);

            boolean isPrim = isPrim(num);

            if (isPrim == true) {
                System.out.println("First prime: " + num);
                break;
            }

            System.out.println(i + " " + str + " " + isPrim);

        }

    }

    public static boolean isPrim(long number) {
        if (number % 2 == 0) {
            return false;
        }
        for (int j = 3; j * j < number; j+=2) {
            if (number % j == 0) {
                return false;
            }
        }
        return true;
    }
}

【问题讨论】:

  • 正如米哈伊尔所说,您需要检查前导零。您还可以检查十位的最后一位(单位)。任何以 0、2、4、5、6 或 8 结尾的十位数字都不能是素数,因为它将以 2 或 5 作为因子。这将节省您对这些数字进行完整的质数测试。

标签: java string boolean primes long-integer


【解决方案1】:

应该是j * j &lt;= number,否则你会把素数的平方当作素数。 IE。你的方法说9 是素数,因为没有小于sqrt(9) 的分隔符。

此外,您的代码可能会找到小于 10 位的素数,因为它会检查 E 的所有 10 位子字符串,包括带有前导零的子字符串,例如 0452353602

另外,您需要将j 的类型更改为long 以避免溢出。

【讨论】:

  • 我做了你建议的改变,但函数仍然返回错误的值
  • 它是否返回小于 10 位的有效素数?
  • 由于前导零,存在小于 10 位的数字。他们返回不是素数。这是我的程序输出的一部分:111 2003059921 false 112 0030599218 false 113 0305992181 false 114 3059921817 false 115 0599218174 false
  • 我将数据类型从 int 更改为 long,程序终于按我想要的方式运行。非常感谢你,米哈伊尔!
  • 如果程序有效,那么您应该接受答案。
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多