0

将结果分配给变量时我遇到了一个小问题,这对我来说是第一次发生。我用“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-statment 中的结果是正确的。但变量在前两个赋值中被减 1。

4

1 回答 1

2

pow是一个浮点函数。它接受并返回浮点数。将浮点数分配给整数变量会将其截断为整数,因此它可能675.9999999就在分配之前,675当分配给整数变量时将变为add

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
}
于 2013-05-21T11:33:47.827 回答