http://blog.jnito.com/entry/20111102/1320253815
http://blog.jnito.com/entry/20111231/1325304733
数値とExcelのA1参照形式を相互変換する問題。
上限無しとかいう制限が入っていますが、とりあえず普通にintの範囲で記述します。
あちらの解答例もint越えを全く考慮してないので特に問題ないでしょう。
第1問第2問合わせても30分かかりませんでした。
つうか第2問のほうが簡単で5分くらいで終わったんだが。
まあPerlで解けと言われたら解けませんけどね。
考え方は簡単で、単に26で割っていくだけです。
26で割り切れる場合だけ注意が必要ですが、それ以外は単純にchr()で数値文字を変換すればいいです。
逆に数値にする場合は、26の例外すらも一切不要です。
何の問題もなく完成。
しかしまあ$amariはないな。
http://blog.jnito.com/entry/20111231/1325304733
数値とExcelのA1参照形式を相互変換する問題。
上限無しとかいう制限が入っていますが、とりあえず普通にintの範囲で記述します。
あちらの解答例もint越えを全く考慮してないので特に問題ないでしょう。
<?php
class EXCEL{
/**
* Excelの列変換、数値から文字列に
* @param int 「1」みたいな数値
* @return String 「A」みたいな文字列
*/
public function getStr($input){
$ret = '';
do{
$tmp = gmp_div_qr($input, 26);
$input = gmp_intval($tmp[0]);
$amari = gmp_intval($tmp[1]);
// 割り切れる場合は0ではなく26として扱う
if($amari === 0){
$input--;
$amari = 26;
}
$ret .= chr($amari+64);
}while($input);
return strrev($ret);
}
/**
* Excelの列変換、文字列から数値に
* @param String 「A」みたいな文字列
* @return int 「1」みたいな数値
*/
public function getInt($input){
$digit = strlen($input)-1;
$ret = 0;
for($i=0;$i<=$digit;$i++){
$ret += (ord($input[$digit-$i])-64) * (26**$i);
}
return $ret;
}
}
// 以下はテスト
$test = [
[1, 'A'],
[2, 'B'],
[3, 'C'],
[25, 'Y'],
[26, 'Z'],
[27, 'AA'],
[28, 'AB'],
[51, 'AY'],
[52, 'AZ'],
[53, 'BA'],
[54, 'BB'],
[256, 'IV'],
[16384, 'XFD'],
];
$excel = new EXCEL();
foreach($test as $key=>$data){
$answer = $excel->getStr($data[0]);
if($answer !== $data[1]){
print('えらー');
}
}
foreach($test as $key=>$data){
$answer = $excel->getInt($data[1]);
if($answer !== $data[0]){
print('えらー');
}
}
第1問第2問合わせても30分かかりませんでした。
つうか第2問のほうが簡単で5分くらいで終わったんだが。
まあPerlで解けと言われたら解けませんけどね。
考え方は簡単で、単に26で割っていくだけです。
26で割り切れる場合だけ注意が必要ですが、それ以外は単純にchr()で数値文字を変換すればいいです。
逆に数値にする場合は、26の例外すらも一切不要です。
何の問題もなく完成。
しかしまあ$amariはないな。
PR