正则表达式解二元方程式

看到了这文我震惊了,正则能解二元方程式~~

原文:

我照着原文写出的正则还真的计较出了功效。上php例子:

<?php /** * 计较 Ax+By=C */ function suan($A, $B, $C) { $A--; $B--; $str = str_repeat('-', $C); $search = '/^(.*)\1{' . $A . '}(.*)\2{' . $B . '}$/'; preg_match($search, $str, $r); return array('x' => strlen($r[1]), 'y' => strlen($r[2])); } $A = 2; $B = 3; $C = 9; $r = suan($A, $B, $C); // 测试 echo '计较' . $A . 'x+' . $B . 'y=' . $C . '<br />'; echo 'x=' . ($r[x]) . '<br />'; echo 'y=' . ($r[y]); // 输出 // 计较2x+3y=9 // x=3 // y=1 ?>

我表明下

来一个简朴的式子来说:2x+3y=9

道理:

在此函数中生成出这样的正则

^(.*)\1{1}(.*)\2{2}$

去匹配一个长度为9的反复字符串 “-”,匹配出两个分组的长度,就是他的x   和  y的值了

正则表明:

【(.*)】也就是0到无数个【.】点号。

\1就是引用一组。后头【{1}】就是反复1次。

后半是\2就是引用2组。后头【{2}】就是反复1次。

以下是谁人英文博客的翻译:

二元方程17x + 12y = 51,其表达式【^(.*)\1{16}(.*)\2{11}$】。很好领略。【(.*)】也就是0到无数个【.】点号。(这里是接着上文说的,其实,【.】点号想暗示的是字符“1”)
也就是0到无数个1,后头【\1】引用一次。后头【{16}】就是16次。浸染于前面的【\1】,也就是16次引用。加上开始的【(.*)】一共正好17次。后头一个就不说了,跟这个一样。
正则引擎会依次实验【(.*)】中0到无数个字符“1”,0个字符“1”,1个字符“1”,2个字符“1”一直增加的实验。直到乐成,不然要实验完所有字符“1”的最大个数(这里是51个字符“1”)。

PS: 没有思量无解的环境,当无解时 x和y都是0

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7869.html