#!/usr/bin/perl use integer; use strict; # k = 96666, za okolo 1 min s -O2, 2 min plain na C my $k = $ARGV[0] or die "usage: $0 number\n"; my @sig = qw( * + - ); my $i = 2; while( $i++ ) { my @op = ( 0 ); my $t = 0; while(4) { $t++; inc_ops( \@op, $i - 1 ); last if $op[ $i - 1 ] > 0; my $ev = '1'; $ev .= $sig[ $op[ $_ - 2 ] ] . $_ for( 2 .. $i ); my $res; eval "\$res=$ev"; #print "ev: $ev=$res\n"; die "FOUND($t): $ev==$k\n" if $res == $k; } } sub inc_ops { my $ar = $_[0]; my $c = 1; for my $i ( 0 .. $_[1] ) { $ar->[$i] = $ar->[$i] + $c; if( $ar->[$i] > 2 ) { $c = 1; $ar->[$i] = 0; } else { $c = 0; } } }