java - 如何生成特殊数字?

标签 java

我需要生成前 20 个素数,以 1 开头,第二个数字是 3。 我知道如何检查一个数字是否是质数,但我在其他部分发现了困难。

有人可以给我更多关于生成一些具有特殊特征的数字的练习吗,因为我发现它们有困难。谢谢

  public static int isprime(int x){
         for(int i=2;i<x;i++)
               if(x%i==0)
                  return false;
        return true;  }

最佳答案

首先,您的 isPrime() 方法可能会更高效一些。检查超出数字平方根的因子是没有意义的,因为如果它们存在,您就会发现它们的伙伴已经低于平方根。因此,您可以将 for 语句的继续条件设置为如下所示:

for (int i = 2; i * i <= x; i++)

您还可以通过仅检查 2 之后的奇数来将速度大致提高一倍。

假设它们不会太大,您可以将它们转换为字符串并查看它是否以 "13" 开头。

在 Java 中,Long.toString()String.startsWith() 可能是完成这项工作的最佳工具。

如果您想自己解决这个问题,那么现在就去做,因为我在下面提供了完整的解决方案。

<小时/>

还在吗?我假设您已经尝试过,或者您只是想要一个解决方案。

例如,参见以下程序:

public class Test {
    public static boolean isPrime (long num) {
        if ((num % 2) == 0) {
            return false;
        }
        for (long chk = 3; chk * chk <= num; chk += 2) {
            if ((num % chk) == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        for (long num = 2, count = 0; count < 20; num++) {
            if (Long.toString(num).startsWith("13")) {
                if (isPrime(num)) {
                    count++;
                    System.out.println ("#" + count + ": " + num);
                }
            }
        }
    }
}

生成:

#1: 13
#2: 131
#3: 137
#4: 139
#5: 1301
#6: 1303
#7: 1307
#8: 1319
#9: 1321
#10: 1327
#11: 1361
#12: 1367
#13: 1373
#14: 1381
#15: 1399
#16: 13001
#17: 13003
#18: 13007
#19: 13009
#20: 13033
<小时/>

如果您需要大量数据(例如前 200 万而不是前 20 个),最后的一点优化可能会提高性能。

为此,我们从 13 开始,然后,只要您的号码以 14 开头,您就可以跳过一大块候选者(例如 14129(含),或从 140,0001,299,999(含)。

这可确保您只检查以 13 开头的数字,例如 13130-1391,300-1,39913,000-13,999 等等。您还可以通过仅检查奇数来加快速度。使用部分数字检查还意味着我们不需要进行字符串转换,我们恢复到纯数字操作,这可能是有益的。

为此,请对代码进行以下更改:

public class Test {
    public static boolean isPrime (long num) {
        if ((num % 2) == 0) {
            return false;
        }
        for (long chk = 3; chk * chk <= num; chk += 2) {
            if ((num % chk) == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        for (long num = 13, end = 14, count = 0; count < 2000000; num += 2) {
            // Code to move from 140..0 to 1299..9

            if (num >= end) {
                end = end * 10;
                num = (end / 14) * 13 - 1;
                continue;
            }
            if (isPrime(num)) {
                count++;
                System.out.println ("#" + count + ": " + num);
            }
        }
    }
}

这将前 200 万个数字的运行时间从 394 秒减少到 323 秒,下降了 18%。

关于java - 如何生成特殊数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27915283/

相关文章:

java - 递归澄清

java - 动态 JTree 和 SwingUtilities.invokeLater() 什么都不做

java - 使用比较器在列表中向上移动元素

Java - 包含检查数组列表中的所有项目是否满足条件

java - 使用 Springboot+JUnit 测试启动器

java - 从文本文件中读取一大行字符串

java - Android - 应用程序关闭时保留文件

用于 if 条件的 Java Lambda 表达式 - 此处不适用

java - KafkaConsumer.close() 为什么?

java - jackson 忽略了特定的属性(property),但能够检查它是否可用