2012-01-29 56 views
0

在Perl中,如何測試數字中的所有可能組合。例如,我感興趣的組合是分離的組合。可能的組合?

例如:53可能是 「5 3」 或只是 「53」 如:215可能是 「21 5」 或 「2 15」

+2

這是Facebook的Hacker Cup 2012嗎?因爲你的問題聽起來像是本輪問題之一。無論如何,我會在大約2個小時內給你答案(這是輪次結束時)。 – Carsten 2012-01-29 16:12:10

+0

不,如果我明天得到答案,真的不介意,只是一個普遍的問題。 – 2012-01-29 16:17:08

+0

在你的例子中,215也可以是「215」或「2 1 5」。 – choroba 2012-01-29 21:11:25

回答

2

事實上,你正在分發空格之間的所有位置個字符。在每個位置上,空間或者是爲每個組合實現或不實現。因此,您可以將其表示爲二進制數,1表示空間存在,0表示空間不存在。

#!/usr/bin/perl 

use warnings; 
use strict; 

my $num = shift; 
my @digits = split //, $num; 
my $length = length($num) - 1; 

if ($length == 0) { 
    print "$num\n"; 
    exit; 
} 

for my $i (0 .. 2 ** $length - 1) { 
    my $mask = sprintf "%0${length}b", $i; 
    my @replace_arr = split //, $mask; 
    my $idx = 0; 
    for (@replace_arr, '') { 
     print $digits[$idx]; 
     print ' ' if $_; 
     $idx++; 
    } 
    print "\n"; 
}