質問
私は今、整数を文字列に変換しようとしていますが、問題があります。
私はほとんどの部分で書かれたコードを手に入れましたが、次の場所に運ぶとき、それは小さな欠陥があります。説明するのは難しいので、例を挙げます。小文字のアルファベットで構成される文字セットでベース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);
私は、ゼロを返すモジュロの上に機能がつまずいていると感じていますが、私はこれに長い間取り組んでおり、それがどのように起こっているのかわかりません。どんな提案でも大歓迎です。
編集:生成された文字列がリトルエンディアンであるという事実は、私のアプリケーションとは無関係です。
解決
あなたが望むものを正しく理解している場合(列にExcelが使用する番号、a、b、.. z、aa、ab、...)、これは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
他のヒント
あなたの問題は、「a」== 0です。
言い換えれば、「aa」は答えではありません。なぜなら、それは本当に00だからです。「ba」はb = '1'であるため正しい答えであるため、ベース26で10になります。
あなたのコードは正しいです、あなたはそれを誤解しているようです。
a = 1とz = 0を作成する必要があると思います。
小数体と比較してください:9の後に10が続き、01ではありません!
私のシステムにコンパイルする著作権図ソリューションを取得するには(GCCバージョン4.6.1(ubuntu/linaro 4.6.1-9ubuntu3を使用しています)、ヘッダーを追加する必要がありました。#include <climits> #include<cstdlib>