发现逻辑错误c ++

时间:2015-01-27 22:38:16

标签: c++

#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.我无法在代码中发现逻辑错误。请注意,我是编码和堆栈溢出的新手,所以请不要太苛刻。任何帮助将不胜感激。

4 个答案:

答案 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为例。从字符串的末尾开始,然后向后工作。即。

  1. 首次循环后,decval = 1
  2. 第二次循环decval = 12
  3. 第三次循环后,decval = 123
  4. 第四次循环后,decval = 1234
  5. 每次将decval乘以10,然后添加新数字。通过这种方式,你不必第一次乘以10,第二次乘以100,第三次乘以1000等等。