Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我将ASCII字转换成数字,但我一直在尝试解码它们。如何转换1=a、2=b、28=ab等?(代码正常) 所以我想我会自学C++,但我似乎没有语言问题,但我真的很愚蠢。_C++_Algorithm_Math_Equation Solving - Fatal编程技术网

我将ASCII字转换成数字,但我一直在尝试解码它们。如何转换1=a、2=b、28=ab等?(代码正常) 所以我想我会自学C++,但我似乎没有语言问题,但我真的很愚蠢。

我将ASCII字转换成数字,但我一直在尝试解码它们。如何转换1=a、2=b、28=ab等?(代码正常) 所以我想我会自学C++,但我似乎没有语言问题,但我真的很愚蠢。,c++,algorithm,math,equation-solving,C++,Algorithm,Math,Equation Solving,所以我的想法是这样的。如果我说a=1,b=2,z=26,aa=27等等,我可以将单词映射到数字,在哈希表中使用布尔值(当然是位屏蔽),并有一个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 <&l

所以我的想法是这样的。如果我说a=1,b=2,z=26,aa=27等等,我可以将单词映射到数字,在哈希表中使用布尔值(当然是位屏蔽),并有一个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;
int-pos;
word\u key\u t char\u key;
word\u key\u t key=0;
const char*raw=word.c_str();

以后不能做一些编辑。我确实误解了关键价值观的产生。我认为从密钥生成的字母将是:

while ( key )
   {
   int char_key = key % 26;
   char c = 'a' + (char)( char_key - 1 );
   key /= CHARS_IN_ALPHABET;      
   }
虽然我仍然不认为钥匙的原始计算是正确的。我仍然认为关键的计算应该是:

key = CHARS_IN_ALPHABET * key + char_key + 1;

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

实际上您有一个基数为27的数字(aa=a*26+b),但避免使用“零”

输入:对DWORD进行编码,使“aa”=27,“ab”=28,等等。 输出:ASCII字符串 突出部分:=“” 当DWORD>0时,执行以下操作 lastLetter=encodedWord%27; encodedWord=encodedWord/27; 突出部分:=toChar(最后一个字母+64)+突出部分; 结束时 回报突出;
您的问题实际上会恢复到从基数10到基数26的转换。 区别在于a=0,b=1,依此类推(0=第一个符号)

另一个注意事项是您没有还原转换后的字符串(ba=53)

这是完整的代码(第一个元素是0,而不是1,即a=0)

与代码中一样,转换字符串中的字符不会反转(就像它们应该在正常的基到基转换中一样)

#包括
整数幂(整数x,整数倍){
int结果=1;
而(乘以--)结果*=x;
返回结果;
}
无效转换(整数n,字符*s){
int i=0;
做{
s[i++]=(n%26)+‘a’;
}而((n/=26)>0);
s[i]=0;
}
int convertBack(字符*s){
int i=0;
int n=0;
而(s[i]){
n+=((s[i]-'a')*功率(26,i));
i++;
}
返回n;
}
void main(){
chars[100];
转换(53,s);
printf(“已转换:%s\n”,s);
printf(“转换回=%d”,转换回);
}

我建议不要使用任何“幂”函数,尤其是浮点函数

以下设置“a”=0,“z”=25,“aa”=26等,仅使用整数加法、乘法和除法(无浮点)工作。编码的每个字符只需要一次乘法,解码的每个字符只需要一次除法

#include <cctype>
#include <iostream>
#include <string>
#include <algorithm>

template <class T>
T encode(const char* s)
{
  T result = 0;
  while (*s != 0)
  {
    result *= 26;
    result += std::tolower(*s) - 'a';
    ++s;
  }
  return result;
}

template <class T>
std::string decode(T x)
{
  std::string s;
  while (x != 0)
  {
    s += x % 26 + 'a';
    x /= 26;
  }
  std::reverse(s.begin(), s.end());
  return s;
}

int main() 
{
  std::cout << decode(encode<unsigned int>("tbce")) << std::endl;
}
#包括
#包括
#包括

#include

通过将基数设为2的幂(例如,在您的情况下为32),您可以在使用稍多的空间和获得更好的执行时间之间进行权衡

通过这种方式,您可以使用移位和逻辑运算,而不是乘法、除法和mod

例如:

void convert(int n, char *s){
    int i = 0;
    do {
        s[i++] = (n && 0x1F) + 'a';
    } while ((n >>= 5) > 0);
    s[i] = 0;
}

int convertBack(char *s){
    int i = 0;
    int n = 0;
    while (s[i]) {
        n += ( (s[i]-'a') >> 5*i;
        i++;
    }
    return n;
}

而且main应该和kcsoft建议的一样。

“我似乎在语言上没有问题,但坦白说我很愚蠢”+1让我笑了我不确定我是否可以在同一句话中使用“但是”两次,但我不相信我能在不引入更多问题的情况下修复它。这看起来像是Excel的“列标题”“列号“算法;-)至少有几个问题与此相关,IIRC@pst,只是找到了答案,复制了代码,它工作得很好。如果你把那条评论作为回答。我会接受的。非常感谢你@Phillumati Nah,会有一些很好的细节回答:)我想他是根据字母正确计算数字的;他想做相反的事情:从数字生成字母。
#include <stdio.h>
int power(int x, int times){
    int result = 1;
    while (times--) result *= x;
    return result;
}
void convert(int n, char *s){
    int i = 0;
    do {
        s[i++] = (n % 26) + 'a';
    } while ((n /= 26) > 0);
    s[i] = 0;
}
int convertBack(char *s){
    int i = 0;
    int n = 0;
    while (s[i]) {
        n += ( (s[i]-'a') * power(26, i));
        i++;
    }
    return n;
}
void main(){
    char s[100];
    convert(53, s);
    printf("Converted:%s\n",s);
    printf("Convert back=%d", convertBack(s));
}
#include <cctype>
#include <iostream>
#include <string>
#include <algorithm>

template <class T>
T encode(const char* s)
{
  T result = 0;
  while (*s != 0)
  {
    result *= 26;
    result += std::tolower(*s) - 'a';
    ++s;
  }
  return result;
}

template <class T>
std::string decode(T x)
{
  std::string s;
  while (x != 0)
  {
    s += x % 26 + 'a';
    x /= 26;
  }
  std::reverse(s.begin(), s.end());
  return s;
}

int main() 
{
  std::cout << decode(encode<unsigned int>("tbce")) << std::endl;
}
void convert(int n, char *s){
    int i = 0;
    do {
        s[i++] = (n && 0x1F) + 'a';
    } while ((n >>= 5) > 0);
    s[i] = 0;
}

int convertBack(char *s){
    int i = 0;
    int n = 0;
    while (s[i]) {
        n += ( (s[i]-'a') >> 5*i;
        i++;
    }
    return n;
}