C++ 当分配给变量时,数字是否会改变值?
我在给变量赋值时遇到了一个小问题,这是我第一次遇到这种情况。我使用“aaa”作为参数调用Convert(),以下是我的输出:C++ 当分配给变量时,数字是否会改变值?,c++,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="abcdefghijklmnopqrstuvwxy
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;
}
正在进行计算,并且按照预期的方式进行,计算结果是正确的。但是变量在前两个赋值中被减1 pow是一个浮点函数。它接受并返回浮点数。将浮点数赋给整型变量会将其截断为整型数,因此它可能在赋给整型变量
add
之前就已经是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
}
int字符数(字符c){
如果(c>='a'&&c感谢您的回答。我仍然不明白为什么从double转换为int时26^2会被截断为25,但至少我知道这是怎么回事,并可以相应地采取行动。我刚刚注意到,您希望最右边(最后一个)的字符在和中具有最低有效值。要实现这一点,请使用“在每个步骤中进行乘法”技术,您必须在字符串上反向迭代。我建议为此使用迭代器。要反向迭代,只需使用string.rbegin()
和string.rend()
并在每一步中递增迭代器。可以找到一个例子。对于浮点舍入错误,。我知道它很长,您不必全部阅读,但特别是关于舍入错误的部分解释了代码中发生的情况。感谢您的输入,尽管我只希望有一天能够理解此类文章。我最终写了一篇g我的pow函数,如果只应用于intgers,它相当简单。
int charNumber(char c) {
if (c >= 'a' && c <= 'z')
return c - 'a'; // calculate the position of c relative to 'a'
else
return -1; // error
}