我将ASCII字转换成数字,但我一直在尝试解码它们。如何转换1=a、2=b、28=ab等?(代码正常) 所以我想我会自学C++,但我似乎没有语言问题,但我真的很愚蠢。
所以我的想法是这样的。如果我说a=1,b=2,z=26,aa=27等等,我可以将单词映射到数字,在哈希表中使用布尔值(当然是位屏蔽),并有一个O(1)拼写检查器。所以写这本书一点问题都没有。我的算法是这样的:我将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
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;
}