コグノスケ


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

link もっと前
2016年4月1日 >>> 2016年3月19日
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年4月1日 >>> 2016年3月19日
link もっと後

管理用メニュー

link 記事を新規作成

<2016>
<<<04>>>
-----12
3456789
10111213141516
17181920212223
24252627282930

最近のコメント5件

  • link 20年8月24日
    すずきさん (08/30 22:06)
    「ですね、自分も今はPulseAudioを...」
  • link 20年8月24日
    hdkさん (08/29 09:32)
    「ALSA懐かしい... PulseAud...」
  • link 16年2月14日
    すずきさん (08/04 01:31)
    「お役に立ったようでしたら幸いです。」
  • link 16年2月14日
    enc28j60さん (08/03 17:40)
    「ちょうど詰まっていたところです。\n非常...」
  • link 25年7月20日
    すずきさん (07/30 00:10)
    「ギクシャクするのは減速時の2速シフトダウ...」

最近の記事20件

  • link 23年4月10日
    すずき (08/31 12:58)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 25年8月25日
    すずき (08/31 12:58)
    「[LinuxでPTPを使う方法] 目次: LinuxNTPより精密な時刻同期の方法PTP(Precision Time Pro...」
  • link 23年5月15日
    すずき (08/30 17:58)
    「[車 - まとめリンク] 目次: 車三菱FTOの話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替えるとしたら?FTO...」
  • link 25年8月30日
    すずき (08/30 17:58)
    「[日本のガソリンスタンド] 目次: 車ガソリンスタンドは統廃合が進んで、ENEOS、コスモ、出光(apollostation)...」
  • link 20年8月24日
    すずき (08/28 23:30)
    「[ALSAループバックデバイスで簡易リモート再生] 目次: ALSAデスクトップPCにはスピーカーを繋いでいませんが、たまに音...」
  • link 23年6月1日
    すずき (08/21 01:43)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 13年5月10日
    すずき (08/21 01:43)
    「[Debian 7.0 Wheezyにアップデート] 目次: 自宅サーバーリリースノートを読みつつ、apt-get updat...」
  • link 15年4月30日
    すずき (08/21 01:42)
    「[Debian 8.0 Jessieにアップデート] 目次: 自宅サーバーDebianのアップデートが来ていたので、試しに職場...」
  • link 23年6月13日
    すずき (08/21 01:42)
    「[Debian 12 Bookwormにアップデート] 目次: 自宅サーバーDebianの更新はとても簡単でありがたいですが、...」
  • link 25年8月17日
    すずき (08/21 01:40)
    「[Debian 13 Trixieにアップデート] 目次: 自宅サーバー先日8/9にDebian 13がリリースされました。コ...」
  • link 25年8月20日
    すずき (08/21 01:38)
    「[パスポートのオンライン申請] 海外出張の予定が発生してパスポートが必要になりました。以前発行した10年パスポートの発行日を見...」
  • link 25年8月15日
    すずき (08/17 06:26)
    「[帰省終わり、東京へ] 帰ってきました。東京に降り立った瞬間に暑くてイヤになりました……。朝10時...」
  • link 25年8月11日
    すずき (08/17 06:20)
    「[帰省始まり、北海道へ] 北海道に帰省しました。今年は北海道も30℃超え連発で割と暑い年とはいえ、東京と決定的に違う点は湿度で...」
  • link 25年7月25日
    すずき (07/30 01:36)
    「[電装系が微妙なジャガーさん] 目次: 車車を買い替えてから1週間くらい経ちました。通勤路以外は幹線道路や高速をメインにしばし...」
  • link 19年9月1日
    すずき (07/30 01:36)
    「[カーナビを買いました] 目次: 車一昨年にカーナビが壊れて(2017年9月3日の日記参照)以来、カーナビを使わず過ごしていま...」
  • link 25年7月20日
    すずき (07/22 01:56)
    「[ジャガーXE Sを買いました] 目次: 車車を買い替えました。ジャガーXE Sです。マイナー車すぎて会社の人たちもあまり知ら...」
  • link 24年7月7日
    すずき (07/22 00:00)
    「[PC - まとめリンク] 目次: PC一覧が欲しくなったので作りました。 スピーカーGX-D90故障ノートPCの内蔵サウンド...」
  • link 21年4月16日
    すずき (07/21 23:59)
    「[ドキュメントスキャナーで書類を電子化] 目次: PC我が家の本棚は広い方ではないのに、ほとんど参照しない書類が幅を取っていて...」
  • link 21年4月6日
    すずき (07/21 23:58)
    「[ディスプレイアーム] 目次: PC机の奥行きが60cmのためか、ディスプレイの足がキーボードとぶつかって若干邪魔なのと、前か...」
  • link 21年2月27日
    すずき (07/21 23:56)
    「[新キーボードMajestouch購入] 目次: PC先日の在宅勤務環境改善(2021年2月12日の日記参照)にて、デュアルデ...」
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

最終更新: 08/31 12:58