コグノスケ


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年11月28日
    hdkさん (12/04 08:10)
    「あれ、停止直前くらいの時のトルクコンバー...」
  • link 25年11月28日
    すずきさん (12/03 11:24)
    「トルクコンバーターがいてエンブレは掛かり...」
  • link 25年11月28日
    hdkさん (12/02 08:02)
    「"停止直前に急にエンブレがほぼゼロになる...」
  • link 25年10月6日
    すずきさん (10/10 13:14)
    「ですね。ccはもはやコンパイラというより...」
  • link 25年10月6日
    hdkさん (10/10 08:27)
    「ただのHello, worldでも試して...」

最近の記事20件

  • link 25年11月28日
    すずき (12/04 02:17)
    「[ジャガーさんの所感] 目次: 車ジャガーXE Sを購入してから4か月が経ちました。通勤で毎日乗っているためか走行距離が3,0...」
  • link 25年11月29日
    すずき (12/02 01:15)
    「[バーベキュー@つくば] 筑波大関連の人が集まってバーベキューするイベントが年1回開かれていて、誘ってもらったので去年から参加...」
  • link 23年5月15日
    すずき (12/02 00:43)
    「[車 - まとめリンク] 目次: 車三菱 FTO GPX '95の話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替え...」
  • link 25年9月7日
    すずき (12/01 22:03)
    「[ジャガーXEのタイヤ交換(FALKEN AZENIS)] 目次: 車タイヤのメーカーが左前だけ違うのと、溝の残りが4mmくら...」
  • link 25年7月20日
    すずき (12/01 22:02)
    「[ジャガーXEを買いました] 目次: 車車を買い替えました。ジャガーXE Sです。マイナー車すぎて会社の人たちもあまり知らなさ...」
  • link 10年9月3日
    すずき (12/01 22:01)
    「[レガシィの納車は明日] 目次: 車中古車屋さんから夕方電話がかかってきました。明日の納車だそうです。担当の方が忙しいかったの...」
  • link 10年9月4日
    すずき (12/01 22:00)
    「[今日の予定] 目次: 車今日の予定はこんな感じ。午前: 納車(茨木)昼: 退寮(高槻)午後: 同期のみなさんと食事(京都)実...」
  • link 25年11月21日
    すずき (12/01 21:55)
    「[ジャガーさんをぶつけた] 目次: 車家の近所の狭い道で路駐してたタクシーをかわして進もうと思したら、左前を電柱にぶつけました...」
  • link 25年11月9日
    すずき (11/23 14:16)
    「[タローマンのゲームTAS動画] 目次: ゲーム今年の夏ごろにシブヤフードダンジョンとタローマンがコラボしたイベント(シブヤフ...」
  • link 21年12月28日
    すずき (11/23 14:14)
    「[ゲーム - まとめリンク] 目次: ゲームNintendo DSを買ったパネルでポンDS最近の朝はパネポンDS聖剣伝説DSチ...」
  • link 25年5月1日
    すずき (11/07 13:52)
    「[首都高バトルSteam版、フルチューン後の姿 - その3] 目次: ゲーム首都高バトル(Steam版)高ランクの車をひたすら...」
  • link 23年4月10日
    すずき (11/04 16:20)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linux kernel 2.4 for ARMが...」
  • link 09年5月18日
    すずき (11/04 16:19)
    「[ffmpegとlibx264] 目次: LinuxせっかくDVDという長めの映像コンテンツが手元にあるので、ffmpegで変...」
  • link 25年10月31日
    すずき (11/02 03:19)
    「[GNU global + pygmentsトラブルシューティングUbuntu編] 目次: Linux先日(2025年10月2...」
  • link 25年10月22日
    すずき (11/02 02:58)
    「[NTPで時刻をすぐに合わせたい] 目次: LinuxNTPで時刻を調整する方法は2つあって、ズレている時間をジワジワ合わせて...」
  • link 23年6月1日
    すずき (11/02 02:42)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 05年11月23日
    すずき (11/02 02:41)
    「[NTPで時計合わせ、その2] 目次: 自宅サーバー11/23現在、未だGoogle先生に捕捉されていない奇跡。それはさておき...」
  • link 05年11月22日
    すずき (11/02 02:41)
    「[NTPで時計合わせ] 目次: 自宅サーバーパソコンの時計は勝手にどんどんずれていきます。放って置くと1分くらいずれていること...」
  • link 15年5月8日
    すずき (11/02 02:40)
    「[GPSは世界一正確な時計、その2] 目次: 自宅サーバー前回(2015年3月9日の日記参照)はGPSモジュールをPCと接続し...」
  • link 15年3月9日
    すずき (11/02 02:40)
    「[GPSは世界一正確な時計] 目次: 自宅サーバーGPSのレシーバーモジュールを買いました。Globalsat BU-353S...」
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

最終更新: 12/04 08:10