分配给变量时的数字更改值?

时间:2013-05-21 11:22:25

标签: c++

将结果分配给变量时遇到了一些问题,这是第一次发生在我身上。我用“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。

1 个答案:

答案 0 :(得分:2)

pow是一个浮点函数。它需要并返回浮点数。将浮点数分配给整数变量会将其截断为整数,因此在赋值之前它可能是675.9999999,当赋值为整数变量{{1}时,它将变为675 }}

add也会舍入浮点数,具体取决于配置,例如6位有效数字。 cout是一个比676.0更好的近似值,因此您会在输出中看到675.999

由于您不想使用实数进行计算,只能使用整数进行计算,因此最好使用积分函数。要获得26 676的力量,最好使用乘法n次。由于你已经使用了一个循环,并希望每个字符具有26的下一个幂,最好是添加一个变量来保持当前的功率值,如下所示:

n

另请注意,您不必在字母表字符串中找到该字符。您也可以使用字符算法来执行此操作:

unsigned long long currentFactor = 1;
for (...) {
    ...
    unsigned long long add = currentFactor * (found+1);
    wvalue += add;
    currentFactor *= 26;
}