コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2016年3月30日 >>> 2016年3月17日
link もっと後

2016年3月30日

表計算ソフトの列名変換問題

昨日のhdkさんの日記(リンク)を見て、自分も挑戦してみました。

元ネタは2011年のブログ(リンク)ですね。

列名を数字(atod)と数字を列名(dtoa)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int atod(char *str)
{
        int len = strlen(str);
        int r = 0;
        int i;

        for (i = 0; i < len; i++) {
                r *= 26;
                r += str[i] - 'A' + 1;
        }

        return r;
}

void dtoa(int r, char *buf)
{
        char tmp[256];
        int p = 0;
        int i, len;

        memset(tmp, 0, sizeof(tmp));
        r -= 1;
        while (r >= 0) {
                tmp[p] = 'A' + (r % 26);
                r = r / 26 - 1;
                p++;
        }

        len = strlen(tmp);
        for (i = 0; i < len; i++) {
                buf[len - i - 1] = tmp[i];
        }
}

int main(int argc, char *argv[])
{
        int dir = atoi(argv[1]);
        char *str = argv[2];
        int r;
        char buf[256];

        switch (dir) {
        case 0:
                r = atod(str);
                printf("%d\n", r);
                break;
        case 1:
                memset(buf, 0, strlen(buf));
                dtoa(atoi(str), buf);
                printf("'%s'\n", buf);
                break;
        }

        return 0;
}

掛かった時間は正確に計ってないですが、atodの方が10分くらいで、dtoaの方が1時間くらいだったと思います。

2文字目以降を求める式(r = r / 26 - 1)を思いつくのに、予想以上に時間が掛かりました。

動作チェック
$ for i in `seq 1 100` `seq 650 750` `seq 17550 17650`; do echo $i `./a.out 1 $i`; done | egrep "[ABYZ]'"
1 'A'
2 'B'
25 'Y'
26 'Z'
27 'AA'
28 'AB'
51 'AY'
52 'AZ'
53 'BA'
54 'BB'
77 'BY'
78 'BZ'
79 'CA'
80 'CB'
650 'XZ'
651 'YA'
652 'YB'
675 'YY'
676 'YZ'
677 'ZA'
678 'ZB'
701 'ZY'
702 'ZZ'
703 'AAA'
704 'AAB'
727 'AAY'
728 'AAZ'
729 'ABA'
730 'ABB'
17550 'YXZ'
17551 'YYA'
17552 'YYB'
17575 'YYY'
17576 'YYZ'
17577 'YZA'
17578 'YZB'
17601 'YZY'
17602 'YZZ'
17603 'ZAA'
17604 'ZAB'
17627 'ZAY'
17628 'ZAZ'
17629 'ZBA'
17630 'ZBB'

二桁目がAになるとき、二桁目がZになるとき、三桁目がAになるとき、三桁目がZになるとき、いずれも特におかしくならないので、他の桁数でもたぶん大丈夫でしょう。

編集者:すずき(2016/03/31 00:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2016年3月30日 >>> 2016年3月17日
link もっと後

管理用メニュー

link 記事を新規作成

<2016>
<<<03>>>
--12345
6789101112
13141516171819
20212223242526
2728293031--

最近のコメント5件

  • link 25年2月19日
    katanaさん (03/21 05:30)
    「katana」
  • link 25年1月23日
    katanaさん (03/20 18:50)
    「katana」
  • link 24年12月9日
    すずきさん (03/14 00:42)
    「Thanks for your comm...」
  • link 24年12月9日
    hyfanさん (03/13 07:21)
    「Hello from Santa Cla...」
  • link 25年2月10日
    すずきさん (02/13 02:03)
    「解読しました。なるほど、exitの引数が...」

最近の記事20件

  • link 23年4月10日
    すずき (03/15 18:17)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 25年3月7日
    すずき (03/15 18:16)
    「[wchanとptrace_may_access()] 目次: Linux以前、LinuxのI/O統計情報が読めないプロセス(...」
  • link 25年3月3日
    すずき (03/15 00:32)
    「[健康保険料率] 給与明細を見ていて、なんか健康保険料がやたら高くないか……?と気になりました。要...」
  • link 22年11月14日
    すずき (03/14 23:35)
    「[電池 - まとめリンク] 目次: 電池ニッケル水素電池(Ni-MH)やリチウムイオン電池などの二次電池。ニッケル水素電池の使...」
  • link 25年3月14日
    すずき (03/14 23:34)
    「[ナトリウムイオン電池] 目次: 電池エレコムからナトリウムイオン電池を使用したモバイルバッテリーが発売されていたので予約しま...」
  • link 25年3月11日
    すずき (03/12 21:15)
    「[首都高バトルSteam版、大体クリア] 目次: ゲームやっと首都高バトル(Steam版)のWondererを全員倒し、ミスタ...」
  • link 21年12月28日
    すずき (03/12 21:14)
    「[ゲーム - まとめリンク] 目次: ゲーム一覧が欲しくなったので作りました。Wizardry(囚われし亡霊の街)敵が強すぎる...」
  • link 25年3月1日
    すずき (03/12 00:21)
    「[レガシィの半年点検(2025)] 目次: 車先週、ディーラーに半年点検に持っていったら毎度おなじみのバッテリーがイカレていて...」
  • link 23年5月15日
    すずき (03/12 00:18)
    「[車 - まとめリンク] 目次: 車三菱FTOの話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替えるとしたら?FTO...」
  • link 25年3月10日
    すずき (03/12 00:06)
    「[誕生日] 42歳になりました。昨年の日記(2024年3月10日の日記参照)を見ると、リモートワークの話をしていました。最近は...」
  • link 25年2月19日
    すずき (03/01 15:49)
    「[LinuxのI/O統計情報が読めないプロセスの謎を追う] 目次: Linux前回はsystemd --userの/proc/...」
  • link 25年2月18日
    すずき (02/25 01:12)
    「[LinuxのI/O統計情報が読めないプロセスが居る] 目次: LinuxLinuxのI/O統計情報(/proc/[pid]/...」
  • link 23年4月28日
    すずき (02/23 00:31)
    「[Linuxの/dev/zeroの実装] 目次: LinuxTwitterで/dev/zeroの話をしている人が居て、そういえ...」
  • link 25年2月17日
    すずき (02/23 00:29)
    「[LinuxのI/O統計情報] 目次: LinuxLinuxは各プロセスがどれくらいI/Oを行ったか記録していて、procファ...」
  • link 25年1月23日
    すずき (02/20 00:27)
    「[首都高バトルSteam版] 目次: ゲーム首都高バトルSteam版を買いました。首都高バトルシリーズは2006年の「首都高バ...」
  • link 25年2月4日
    すずき (02/16 23:34)
    「[次のWindows 11でE480が見捨てられそう] 今使っているノートPC(Lenovo ThinkPad E480)のC...」
  • link 25年1月30日
    すずき (02/16 22:10)
    「[Thunderbirdの消せないツールバー] Thunderbird 115.0(Supernova, 2023/07/11...」
  • link 25年2月3日
    すずき (02/16 18:37)
    「[不思議なChromeの広告] Google ChromeでYahoo!を見ているとたまにChromeの広告が表示されます。C...」
  • link 25年1月27日
    すずき (02/16 16:37)
    「[Ansibleのencrypted variablesをdecryptする] Ansibleのencrypt_stringで...」
  • link 21年5月22日
    すずき (02/12 00:33)
    「[ベンチマーク - まとめリンク] 目次: ベンチマーク一覧が欲しくなったので作りました。最速のyes不安定なyesyesの高...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 03/21 05:30