LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1383|回复: 6

[已分析][技巧]判断一个数是否为素数.

[复制链接]
发表于 2004-4-21 14:35:36 | 显示全部楼层 |阅读模式
$perl -le 'print "RIME" if (1 x shift) !~ /^(11+)\1+$/' 19
PRIME
发表于 2004-4-21 19:06:43 | 显示全部楼层

回复: 判断一个数是否为素数.

最初由 sunriver 发表
$perl -le 'print "RIME" if (1 x shift) !~ /^(11+)\1+$/' 19
PRIME

看不太明白,请解释解释:thank
发表于 2004-4-21 20:29:17 | 显示全部楼层
有趣,有趣。
我来分析一下吧:

perl -le 'print "RIME" if (1 x shift) !~ /^(11+)\1+$/' 19

1、先看shift:shift = shift @_ = 19

2、(1 x shift):x 是字符串运算符,1 x 19 = "1111111111111111111",共19个1。

3、再看/^(11+)\1+$/:这里的\1 就是前面的(11+),这个正则表达式是用来判断前面的"111111……11111",能否被长度大于一的子串等分。如果不是(!~),就证明它是素数,那就print "RIME"。

就是这样。
发表于 2004-4-22 03:20:44 | 显示全部楼层
:thank BBDD.
那用取模的方法应该也可以得到吧? :ask
发表于 2004-4-22 09:05:14 | 显示全部楼层
取模的方法当然能用,但那样的话不但无趣,而且还把perl降低到和C同样水准。
学习perl,实质上就是在学习如何用来正则表达式解决问题。在这方面,本程序做了很好的演示。
发表于 2004-4-22 11:34:58 | 显示全部楼层
最初由 BBDD 发表
取模的方法当然能用,但那样的话不但无趣,而且还把perl降低到和C同样水准。
学习perl,实质上就是在学习如何用来正则表达式解决问题。在这方面,本程序做了很好的演示。

谢谢,好好学习
 楼主| 发表于 2004-4-22 13:20:00 | 显示全部楼层
关键是正则表达式:/^(11+)\1+$/
...
$num=27;
$str=1 x $num;
if ($str =~ /^(11+)\1+$/)
{
   print "NO PRIME ",$1;
}
...
()匹配的是9个'1'..也是最大因子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表