发现逻辑错误 c++

Spotting the Logic error c++

本文关键字:c++ 错误 发现      更新时间:2023-10-16
#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。我无法发现代码中的逻辑错误。请注意,我既是编码新手,也是堆栈溢出的新手,所以请不要太苛刻。任何帮助将不胜感激。

你忘了将decval初始化为 0。它可能包含一个任意值,这会弄乱您的结果。

此代码:

(c[i] - '0') * pow(10, k);
将整型

类型转换为浮型,执行浮点数学运算,然后转换回整型 (请参阅此问题)

您绝对有可能将 59.99999 的舍入误差向下舍入到 59。

逻辑调整为仅使用整数数学将修复它。

int multiplier = 1;
for(i = 0; i < c.length(); i++, multiplier *= 10){
    decval += (c[i] - '0') * multiplier;
    ++k;
} 

这也是一个解决方案,我认为非常简单:

#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;
}

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.

每次将十进制乘以 10 并添加新数字时。通过这样做,您不必第一次乘以 10,第二次乘以 100,第三次乘以 1,000,依此类推。