[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 523066680 于 2019-3-29 16:12 编辑
  1. use Time::HiRes qw/time/;
  2. use Algorithm::Permute;
  3. my $ta = time();
  4. my $iter = Algorithm::Permute->new ( [0..9], 6 );
  5. my (@digits, @res);
  6. my ($num, $unique);
  7. # 尾数 0 1 5 6 相乘都产生与本身相同尾数的值
  8. my @repeat = map { ($_ * $_) =~ $_ ? 1 : 0  } (0 .. 9);
  9. while ( @res = $iter->next )
  10. {
  11.     next if $res[0] == 0;
  12.     next if $repeat[ $res[-1] ];
  13.     $num = join("", @res);
  14.     @digits = (0)x10;
  15.     $unique = 1;
  16.     grep { $digits[$_] = 1 } @res;
  17.     for (split("", $num * $num )) {
  18.         $unique = 0, last if $digits[$_]
  19.     }
  20.     printf "%d\n", $num if $unique;
  21. }
  22. printf "time usage: %.2fs\n", time()-$ta;
复制代码
  1. 639172
  2. 203879
  3. time usage: 0.40s
复制代码
强行优化,0 1 5 6 平方后末位与自身相同
my @repeat = map { ($_ * $_) =~ $_ ? 1 : 0  } (0 .. 9);
1

评分人数

    • ivor: 感谢分享技术 + 1

TOP

本帖最后由 523066680 于 2019-3-29 17:12 编辑

提速,在递归排列的每一层都做重复数的排查。
细节,例如当前累积到3位数,133*133 = 17689,那么只判断 689 是否与 133重合,而不考虑 17,因为 17 可能受到高位数的影响而变化。
  1. use Time::HiRes qw/time/;
  2. my $ta = time();
  3. our $maxlen = 6;
  4. permute([], [0..9], 0);
  5. printf "time usage: %.2fs\n", time() - $ta;
  6. sub permute
  7. {
  8.     my ($a, $b, $lv) = @_;
  9.     return if $lv > $maxlen;
  10.     if ( $lv > 0 and $a->[0] != 0 )
  11.     {
  12.         my $n = join("", @$a);
  13.         my $mp = $n*$n;
  14.         $mp = substr($mp, -$lv) if ($lv < $maxlen);
  15.         for ( 0 .. $#$a ) { return if $mp =~ $a->[$_] }
  16.         if ($lv == $maxlen)
  17.         {
  18.             printf "%d %d\n",  $n, $mp;
  19.             return;
  20.         }
  21.     }
  22.     for ( 0 .. $#{$b} ) {
  23.         permute( [ $b->[$_], @$a ] , [@{$b}[0..$_-1, $_+1..$#$b]], $lv+1);
  24.     }
  25. }
复制代码
639172 408540845584
203879 41566646641
time usage: 0.05s
2

评分人数

TOP

返回列表