【问题标题】:How does this regex find primes? [duplicate]这个正则表达式如何找到素数? [复制]
【发布时间】:2011-03-18 18:51:03
【问题描述】:

可能重复:
How to determine if a number is a prime with regex?

This page 声称这个正则表达式发现了非素数(反例:素数):

/^1?$|^(11+?)\1+$/

这是如何找到素数的?

【问题讨论】:

  • 不是一个骗局。这是一个不同的正则表达式和不同的技术,并且有更好的答案,可以启动。
  • @bmargulies:这骗子。正则表达式是相同的,考虑到这个问题的输入限制,并且 Java 的 String.matches 方法将正则表达式与整个字符串匹配(所以 ^ 和 $ 是隐含的),它显然是这样做的。
  • @Rog - 那里的赞成答案从未提及一元。
  • @bmargulies:如果您认为您可以为该问题提供更好或更完整的答案,请这样做。我会将此问题标记为合并,但问题文本中的 表面 差异意味着答案需要进行一些编辑(通常是这种情况),即使在您消除这些表面差异后问题是相同的。
  • @Rog 在这一点上,我相信钻石会巧妙地合并。

标签: regex primes


【解决方案1】:

我认为这篇文章解释得很好,但我也会尝试一下。

输入格式为unary。 1 是1,2 是11,3 是111,等等。0 是一个空字符串。

正则表达式的第一部分将 0 和 1 匹配为非素数。第二个是魔法发挥作用的地方。

(11+?) 从寻找除数开始。它首先被定义为 11 或 2。\1 是一个引用先前捕获的匹配项的变量,因此 \1+ 确定该数字是否可以被该除数整除。 (111111首先将变量赋值给11,然后确定剩余的111111重复的,所以6可以被2整除。)

如果数字不能被 2 整除,正则表达式引擎会增加除数。 (11+?) 变成 111,然后我们再试一次。如果在任何时候正则表达式匹配,则该数字有一个不产生余数的除数,因此该数字不能是素数。

【讨论】:

  • 这真是太棒了。
  • 这个答案真是太棒了.. :)
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 2011-02-05
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多