2

現在、整数を文字列に変換しようとしていますが、問題が発生しています。

私はコードを書き、ほとんどの部分で動作するようになりましたが、次の場所に運ぶときに小さな欠陥があります。説明するのが難しいので、例を挙げます。小文字のアルファベットで構成される文字セットで base 26 を使用する:

0 = "a"
1 = "b"
2 = "c"

...

25 = "z"
26 = "ba" (これは "aa" に等しくなければなりません)

特定の状況で、文字セットのゼロの位置にある文字をスキップするようです。

私を混乱させているのは、自分のコードに何も問題がないことです。私はこれにあまりにも長い間取り組んできましたが、まだ理解できません。

char* charset = (char*)"abcdefghijklmnopqrstuvwxyz";
int charsetLength = strlen(charset);

unsigned long long num = 5678; // Some random number, it doesn't matter
std::string key

do
{
    unsigned int remainder = (num % charsetLength);
    num /= charsetLength;

    key.insert(key.begin(), charset[remainder]);

} while(num);

関数がゼロを返すモジュロでつまずいているような気がしますが、これに長い間取り組んできたので、それがどのように起こっているのかわかりません。どんな提案でも大歓迎です。

編集:生成された文字列がリトルエンディアンであるという事実は、私のアプリケーションには関係ありません。

4

4 に答える 4

5

あなたが何を望んでいるかを正しく理解していれば(列、A、B、.. Z、AA、AB、...にExcelで使用される番号付け)、これは1から始まる数値を表すことができるベースの表記法です.26桁には値があります1、2、... 26 で、基数は 26 です。つまり、A の値は 1、Z 値は 26、AA 値は 27 です... この表現の計算は、1 のオフセットを調整する必要がある通常の表現と非常によく似ています。 0 の代わりに。

#include <string>
#include <iostream>
#include <climits>

std::string base26(unsigned long v)
{
    char const digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    size_t const base = sizeof(digits) - 1;
    char result[sizeof(unsigned long)*CHAR_BIT + 1];
    char* current = result + sizeof(result);
    *--current = '\0';

    while (v != 0) {
        v--;
        *--current = digits[v % base];
        v /= base;
    }
    return current;
}

// for testing
#include <cstdlib>

int main(int argc, char* argv[])
{
    for (int i = 1; i < argc; ++i) {
        unsigned long value = std::strtol(argv[i], 0, 0);
        std::cout << value << " = " << base26(value) << '\n';
    }
    return 0;
}

1 2 26 27 52 53 676 677 702 703 で実行すると、

1 = A
2 = B
26 = Z
27 = AA
52 = AZ
53 = BA
676 = YZ
677 = ZA
702 = ZZ
703 = AAA
于 2010-02-19T08:36:10.760 に答える
4

あなたの問題は、「a」== 0.

つまり、'aa' は答えではありません。これは実際には 00 であるためです。'ba' は、b = '1' であるため、正しい答えです。つまり、26 進数で 10 になり、10 進数で 26 になります。

あなたのコードは正しいですが、あなたはそれを誤解しているようです。

于 2010-02-19T06:19:21.627 に答える
0

Aprogrammers ソリューションを自分のシステムでコンパイルするには (gcc バージョン 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3 を使用しています))、ヘッダーを追加する必要がありました。#include <climits> #include<cstdlib>

于 2012-04-10T07:28:57.687 に答える
0

a=1 と z=0 にする必要があると思いますので、abc...z は 10 進数の 1234...90 と同じです。

これを 10 進法と比較してください。9 の後には 01 ではなく 10 が続きます!

于 2010-02-19T09:08:40.923 に答える