廣島です.
slashdot.jp の解は正しいですか????
a => 0, b => 1 のように,0 から始めているのは良いとして,
aaa => 77 と 3 文字以上になる場合は考えてないようです.
# Excel には 3 文字以上のラベルは無いのかな?
a => 1 から始めた場合,aaa は a-z, aa-zz の次ですから,
aaa => 1 + 26 + 26*26 = 703 の筈ですね.
ところで,くすのきさんの方法
> dec = 0
> for (i = 0; i < keta ; i++) {
> dec = dec + excel[substr(row, keta - i, 1)]*26^i
>
> }
では ABCD の場合の計算,
1*26^3 + 2*26^2 + 3*26 + 4 = 19010
を D から始めることになります,つまり
((4 + 3*26) + 2*26^2) + 1*26^3
です.しかし,A から始めた方が ^ を含め積の回数が
少なくなって効率は良いはずです.(少なくとも C 言語のレベルで)
((1*26 + 2)*26 + 3)*26 + 4
これだと積は 3 回だけです.
perl の例を 1 つ.
sub labelConv {
my $label = shift;
my $base = ord('A') - 1;
my @seq = map { ord($_) - $base } split(//, uc $label);
my $num = 0;
foreach my $x (@seq) {
$num = $num * 26 + $x;
}
return $num;
}
-----------------------------
廣島 勉
(tsutomu@...)