当前位置: 首页 > 面试题库 >

Java中的Arcane isPrime方法

皮承基
2023-03-14
问题内容

请考虑以下方法:

public static boolean isPrime(int n) {
    return ! (new String(new char[n])).matches(".?|(..+?)\\1+");
}

我从来都不是正则表达式专家,所以谁能完全解释这种方法的实际工作原理? 此外 ,与确定整数是否为质数的其他可能方法相比,它是否有效?


问题答案:

首先,请注意此正则表达式适用于一元计数系统中表示的数字,即

1       is 1
11      is 2
111     is 3
1111    is 4
11111   is 5
111111  is 6
1111111 is 7

等等。确实,可以使用任何字符(因此.表达式中为s),但是我将使用“ 1”。

其次,请注意此正则表达式匹配 复合 (非素数)数字;因此,否定会检测素数。

说明:

表达式的前半部分

.?

说字符串“”(0)和“ 1”(1)是匹配项, 即不是素数
(根据定义,尽管可以争论)。

第二部分用简单的英语说:

匹配长度至少为2的最短字符串,例如“ 11”(2)。现在,看看是否可以通过重复它来匹配整个字符串。“ 1111”(4)是否匹配?“
111111”(6)是否匹配?“ 11111111”(8)是否匹配?等等。如果不是,请再次尝试使用下一个最短的字符串“ 111”(3)。等等。

现在,您可以看到,如果原始字符串不能作为其子字符串的 倍数 进行匹配,那么按照定义,它就是质数!

顺便说一句,非贪婪的运算符?使“算法”从最短的地方开始计数。

效率:

通过各种论点,这很有趣,但肯定没有效率,我将在下面合并其中的一些论点:

  • 正如@TeddHopp所指出的那样,众所周知的筛网筛查方法不会费心检查整数(例如4、6和9)的倍数,而它们已经在检查2和3的倍数时已经“访问过”。方法彻底检查每个较小的整数。

  • 正如@PetarMinchev指出的,一旦达到数字的平方根,我们就可以“短路”倍数检查方案。我们应该能够因为一个因素 更大的 比一个因素平方根必备伴侣 较少 比的平方根(因为比平方根更大,否则两个因素会产生产品大于号),如果这更大的因素存在,那么我们应该已经遇到(因此匹配)了较小的因素。

  • 正如@Jesper和@Brian简洁地指出的那样,从非算法的角度来看,考虑正则表达式如何通过 分配内存来存储字符串例如 char[9000] 9000) 开始。那么,这很容易,不是吗?;)

  • 正如@Foon所指出的那样,存在一些概率方法,对于较大的数字,可能会更有效,尽管它们可能并不总是正确的(取而代之的是伪素数)。但是,也有确定性测试100%准确,并且比基于筛子的方法效率更高。Wolfram的总结很不错。



 类似资料:
  • 问题内容: 我想知道为什么他们在Java中设计方法来接受数组的输入? 在我看来,他们不需要此输入,因为ArrayList实例本身具有足够的详细信息以将数据转换为数组。 我的问题是为什么他们仍然需要传递数组?谢谢。 问题答案: 我能想到的两个原因: 删除表示通用参数在运行时不可用,因此不 知道 它包含字符串,而只是原始类型。因此,所有对的调用都必须返回,这并不是严格正确的。您实际上必须创建第二个数组

  • 问题内容: Object类中的getClass方法如何能够动态返回Class? 问题答案: 它不返回类 名 -返回代表该对象类型的类型。每个对象都“知道”它实际上是什么类型- 这取决于执行时间类型,即强制转换如何工作或失败。只是从对象中检索相关信息。 如果您的类仅包含一个,则每个对象仍将在内存中占用4个以上的字节:有效地存在一个对象“标头”,其中包含对对象的实际类型的引用,与监视器关联的信息该对象

  • 我目前正在学习方法和使用方法。有时,在决定在参数中放入什么时,我会感到困惑。我有一些代码,我在其中创建了三个方法,它们都对应。我必须为这个程序做的是显示一些服务和价格,并询问用户是否愿意。如果他们说是的话,价格会一直累积到数组结束。在我的第三种方法中,我遇到的问题是如何从main获得价格。我知道我应该使用void方法,因为我没有返回任何东西,只是将价格打印给用户。以下是我的程序代码: 具体而言,这

  • 本文向大家介绍Java中的StringBuilder类的方法。,包括了Java中的StringBuilder类的方法。的使用技巧和注意事项,需要的朋友参考一下 以下是StringBuilder类提供的各种构造函数。 SN 构造函数与说明 1 StringBuilder() 构造一个不包含任何字符且初始容量为16个字符的字符串生成器。 2 StringBuilder(CharSequence seq

  • 问题内容: 在回答前面的一些问题以及最近的工作时,我一直在想为什么Java不支持其内置类中的方法链接。 例如,如果我要创建一个类,可以通过以下方法而不是void来使其 可链接: 内置库为什么不倾向于以这种方式执行操作?方法链接有不利之处吗? 我可能忽略了一些可以解释缺少方法链接的内容,但是任何默认返回void的setter方法都应该返回 对此 的引用(至少在我看来应该如此)。这样可以使以下情况更加

  • 问题内容: 在回答前面的一些问题以及最近的工作时,我一直在想为什么Java不支持其内置类中的方法链接。 例如,如果我要创建一个类,可以通过以下方法而不是void来使其 可链接: 内置库为什么不倾向于以这种方式执行操作?方法链接有不利之处吗? 我可能忽略了一些可以解释缺少方法链接的内容,但是任何默认返回void的setter方法都应该返回 对此 的引用(至少在我看来应该如此)。这样可以使以下情况更加

  • 问题内容: 在Java类中,我有一个方法,有时需要很长时间才能执行。也许它挂在该方法流程中。我想要的是,如果该方法在特定时间内未完成,则程序应退出该方法,并继续进行其余的流程。 请让我知道有什么方法可以处理这种情况。 问题答案: 您必须使用线程才能实现此目的。线程是无害的:)下面的示例将一段代码运行10秒钟,然后结束它。