#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main(int argc, char **argv)
{
string c;
int k = 0, decval, i;
cout << "Please input your number starting from lowest value number to highest" << endl;
cin >> c;
//the for loop takes a backwards integer and makes it forwards.
for(i = 0; i < c.length(); i++){
decval += (c[i] - '0') * pow(10, k);
++k;
}
cout << decval;
return 0;
}
所以我的问题是当我输入像564这样的东西(希望得到465作为回报)时我得到462.我无法在代码中发现逻辑错误。请注意,我是编码和堆栈溢出的新手,所以请不要太苛刻。任何帮助将不胜感激。
答案 0 :(得分:6)
您忘记将decval
初始化为0.它可能包含一个任意值,会影响您的结果。
答案 1 :(得分:4)
此代码:
(c[i] - '0') * pow(10, k);
将积分类型转换为浮点,执行浮点数学运算,然后转换回积分类型。 (见this question)
您绝对有可能将59.99999的舍入错误向下舍入到59。
调整逻辑以仅使用整数数学将解决它。
int multiplier = 1;
for(i = 0; i < c.length(); i++, multiplier *= 10){
decval += (c[i] - '0') * multiplier;
++k;
}
答案 2 :(得分:1)
这也是一个解决方案,我认为非常简单:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(int argc, char **argv)
{
string str;
cout << "Please input your number starting from lowest value number to highest" << endl;
cin >> str;
reverse(str.begin(), str.end());
int number = stoi(str);
cout << number << endl;
return 0;
}
答案 3 :(得分:0)
Drew和nicebyte在他们指出的内容中都是正确的。只是想补充一点,您可以在没有k
,额外multiplier
变量,调用pow()
或舍入问题的情况下执行此操作:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main(int argc, char **argv)
{
string c;
int decval = 0, i;
cout << "Please input your number starting from lowest value number to highest" << endl;
cin >> c;
//the for loop takes a backwards integer and makes it forwards.
for( i=c.size()-1 ; 0<=i ; --i ) decval = c[i] - '0' + 10*decval;
cout << decval << endl;
return 0;
}
for
循环的说明:
以数字4321
为例。从字符串的末尾开始,然后向后工作。即。
decval = 1
。decval = 12
。decval = 123
。decval = 1234
。每次将decval乘以10,然后添加新数字。通过这种方式,你不必第一次乘以10,第二次乘以100,第三次乘以1000等等。