c++ - 我将 ASCII 单词转换为数字,但无法解码它们。如何转换 1=a、2=b、28=ab 等? (伪代码好吧)

标签 c++ algorithm math equation-solving

所以我想自学 C++,但我似乎对这门语言没有任何问题,但坦率地说我很愚蠢。

所以我的想法是这样的。如果我说 a=1、b=2、z=26、aa=27 等,我可以将单词映射到数字,在哈希表中使用 bool 值(当然是位掩码),并有一个 O(1) 拼写检查器。所以这样写完全没有问题。我的算法是这样的:

int pos;
word_key_t char_key;
word_key_t key = 0;
const char *raw = word.c_str();

cout << "Entering getKey loop with " << raw << endl;
for (pos = 0; raw[pos] != '\0'; pos++) {
    if (raw[pos] >= 'A' && raw[pos] <= 'Z') {
        char_key = raw[pos] - 'A';
    } else if (raw[pos] >= 'a' && raw[pos] <= 'z') {
        char_key = raw[pos] - 'a';
    } else {
        throw new runtime_error("Unrecognised Character");
    }

    key += (char_key + 1) * (pow(CHARS_IN_ALPHABET, pos));
}

cout << "word: " << raw << " ,score: " << key << endl;
return key;

看起来有效,

a=1 b=2 ab=53 ac=79。

我相信这是正确的。

但是,我在尝试解码它时遇到问题。这是我最好的尝试,但没有成功。我相信我需要使用 pow(26,position) 并从字符串末尾递减,但我只是在努力实现这一点。这是一些可行的独立代码,但做了错误的事情:

#include <iostream>
#include <inttypes.h>
#include <string.h>

typedef uint32_t word_key_t;
const int CHARS_IN_ALPHABET = 26;
const int BUFFER_SIZE = 255; //ignore this for now.

using namespace std;

string reverseKey(const word_key_t key); //broken algo

int main(int argc, char** argv) {
        reverseKey(53); // 53 = ab
        return 0;
}

//disassemble a word_key_t into it's original string. returns lowercase only
string reverseKey(const word_key_t key)
{

  char chr, buffer[BUFFER_SIZE];
  word_key_t keyc = key, isolated, pos = BUFFER_SIZE;

  cout << "key: " << keyc << endl;

  while (keyc != 0) {
      isolated = (keyc - 1) % ((word_key_t)CHARS_IN_ALPHABET + 1);
      cout << "key: " << keyc << ", isolated: " << isolated << endl;
      chr = (char)'a' + isolated - 1;
      cout << "isolated character: " << chr << endl;
      keyc = (keyc - isolated) / CHARS_IN_ALPHABET;
      cout << "new key: " << keyc << endl;
      pos++;
  }

  string s("test");
  return s;

}

如果有人可以插入我找到正确的伪代码来解决这个问题,我将非常感激。我有点疯狂,失去了解决方案的情节。我就是看不到。有些东西告诉我 2logX/2log26,我想我只需要一些更聪明的眼睛来关注它。然后我就可以继续学习 C++。`在此处输入代码

最佳答案

稍后进行一些编辑。我确实误解了关键值的生成。我认为从 key 生成字母将是:

while ( key )
   {
   int char_key = key % 26;
   char c = 'a' + (char)( char_key - 1 );
   key /= CHARS_IN_ALPHABET;      
   }

虽然我仍然不认为原来计算的 key 是正确的。我仍然认为关键计算应该是:

key = CHARS_IN_ALPHABET * key + char_key + 1;

以相反的顺序处理raw[]数组,以避免以相反的顺序提取它们。

关于c++ - 我将 ASCII 单词转换为数字,但无法解码它们。如何转换 1=a、2=b、28=ab 等? (伪代码好吧),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8408725/

相关文章:

php - 在 WAMP 64 位架构上加载 Mongo Driver 1.6.x 驱动程序

c++ - 加密++ 版本 5.6.0

android - 根据屏幕尺寸转换 X 和 Y 像素

c++ - 在不使用定义的情况下缩短调用/名称

c++ - boost Asio : Catching signals without keeping an otherwise finished io_service running

java - 如何遍历所有可能的解决方案路径并选择最佳路径

c++ - 查找加起来等于特定数字倍数的数组子集的数量

php - 优化具有大量线程的 PHP 算法?

math - 射线转换与具有法线和偏移的无限平面相交

java - 如何在不使用正则表达式的情况下解析操作数和运算符的数学表达式并解决它?