郭溢譞 2010年07月05日 星期一 23:45 | 1527次浏览 | 0条评论
看到abi
一开始,我看见这个程序,检测素数的:
#Test primality (by abigail)
perl -le '(1x shift)=~/^1?$|^(11+?)\1+$/||print"Prime"' p
(最后的p代表一个正整数,下同)
感觉比较有意思,然后加工了一下。
于是写了这个,求最大公约数:
#gcd (m, n)
perl -le '@_=@ARGV;(1x$_[0]." ".1x$_[1])=~/^(1+)\1* \1+$/;print length$1;' m n
然后还有欧拉函数的(Euler's phi(n)):
perl -le '$n=shift;(1x$n." ".1x$_)=~/^(11+)\1* \1+$/o or$p++for 1..$n;print$p;' n
# perl v5.8 tested
perl -le '$n=shift;(1x$n." ".1x$n)=~/(?>(11+)\1* \1+$(?{$n--}))./;print$n;' n
# only >= v5.10
perl -le '$n=shift;(1x$n." ".1x$n)=~/(?>(11+)\1* \1+$(?{$n--}))(*FAIL)/;print$n;' n
# use PRUNE
perl -le '$n=shift;(1x$n." ".1x$n)=~/(*:s)(11+)\1* \1+$(?{$n--})(*PRUNE:s)g/;print$n;' n
求一个正整数的所有因子,从小到大排列:
perl -le '(1x shift)=~/^(1+?)\1*\z(?{print length$1})./' n
素因数分解,(这个太长了,应该再改短一点)
perl -le '$n=shift;$_=1x$n;while(s/^(1+)\1+$/$1/){print($n/length);$n=length}' n
(注:这些程序因为要写得很短,所以速度就不重要了,效率都不高)
Zeuux © 2024
京ICP备05028076号
暂时没有评论