在将结果赋给变量时,我遇到了一个小问题,这是我第一次遇到这种情况。我使用"aaa“作为参数调用Convert(),下面是我的输出:
aaa
**676** *(value from cout)* = 26^(3-1)*1 **675** *(value of the variable)*
+26 = 26^(3-2)*1 700
+1 = 26^(3-3)*1 701
701下面是代码:
string alphabet="abcdefghijklmnopqrstuvwxyz";
unsigned long long Convert(string &str){
unsigned long long wvalue=0;
for(int i=0;i<str.size();++i){
size_t found=alphabet.find(str[i]);
if(found==string::npos)
cout<<"Please enter only lowercase letters of the english alphabet!"<<endl;
unsigned long long add=((found+1)*pow(26,(str.size()-(i+1))));
wvalue+=add;
if(i>0)cout<<"+";
cout<<"\t"<<((found+1)*pow(26,(str.size()-(i+1))))<<" = "<<"26^("<<str.size()<<"-"<<(i+1) <<")*"<<(found+1)<<"\t"<<wvalue<<endl;
}
return wvalue;
}很有可能我遗漏了一些非常明显的东西,但我不能弄清楚。
((found+1)*pow(26,(str.size()-(i+1)))) 正在进行计算,并且它正在做它应该做的事情,则cout语句中的结果是正确的。但在前两个赋值中,该变量被减去1。
发布于 2013-05-21 19:33:48
pow是一个浮点函数。它接受并返回浮点数。将浮点数赋值给整数变量会将其截断为整数,因此它可能在赋值之前为675.9999999,当赋值给整数变量add时,它将转换为675。
cout还将浮点数舍入为6位有效数字,具体取决于配置。676.0是比675.999更好的近似值,因此您可以在输出中看到676。
既然你不想用实数计算,而只想用整数计算,你最好还是用整数函数。要将26乘以n的幂,最好使用乘法n时间。由于您已经使用了一个循环,并且希望每个字符的下一个幂为26,因此最好添加一个变量,在该变量中保留当前的幂值,如下所示:
unsigned long long currentFactor = 1;
for (...) {
...
unsigned long long add = currentFactor * (found+1);
wvalue += add;
currentFactor *= 26;
}还请注意,您不必在字母串中查找字符。您也可以只使用字符算术来完成此操作:
int charNumber(char c) {
if (c >= 'a' && c <= 'z')
return c - 'a'; // calculate the position of c relative to 'a'
else
return -1; // error
}https://stackoverflow.com/questions/16668760
复制相似问题