C++,函数中的cout行影响结果,没有cout行函数无法工作

pu82cl6c  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(228)

我正在尝试解决Codewars任务,面临着一个对我来说很奇怪的问题。
代码的任务是编写函数digital_root(n),对n的位数求和,直到最终结果中只有1位。例如:942 --〉9 + 4 + 2 = 15 --〉1 + 5 = 6(函数返回6)。
我写了一些庞大的代码与支持功能,请参阅代码与注解如下。
问题- digital_root函数只有当我把cout行放在while循环中时才能工作。如果没有cout行,函数返回的结果是无意义的(请参见函数代码中的注解)。
我的问题是:
1.为什么digital_root在没有cout行的情况下无法工作?

  1. cout行如何影响函数的结果?
    1.为什么cout行修复代码?
    谢谢!我是一个初学者,花了几天时间试图解决这个问题。
#include <iostream>
#include <cmath>
#include <string>
using namespace std;

int getDigit (int, int);
int sumDigits (int);
int digital_root (int);

int main() 
{
    cout << digital_root (942); // expected output result is 6 because 9 + 4 + 2 = 15 -> 1 + 5 = 6
}

int getDigit (int inputNum, int position) // returns digit of inputNum that sits on a particular position (works)
{
    int empoweredTen = pow(10, position-1);
    return inputNum / empoweredTen % 10;
}

int sumDigits (int inputNum) // returns sum of digits of inputNum (works)
{
    int sum;
    int inLen = to_string(inputNum).length();
    int i = inLen;
    while (inLen --)
    {
        sum += getDigit(inputNum, i);
        i --;
    }
    return sum;
}

int digital_root (int inputNum) // supposed to calculate sum of digits until number has 1 digit in it (abnormal behavior)
{
    int n = inputNum;
    while (n > 9)
    {
        n = sumDigits(n);
        cout << "The current n is: " << n << endl; // !!! function doesn't work without this line !!!
    }
    return n;
}

我试着用Google从头重写代码几次,但我看不到错误。我希望digital_root()在没有cout行的情况下也能工作。目前,如果我从digital_root()的while循环中删除cout行,函数在计算13秒后返回-2147483647。可悲。

lstz6jyr

lstz6jyr1#

下面是一个使用整数运算符的实现,而不是调用std::to_string()std::pow()函数--这实际上适用于浮点数。它使用两个整数变量nSumnRem,保存输入数的运行和和和余数。

// calculates sum of digits until number has 1 digit in it
int digital_root(int inputNum)
{
    while (inputNum > 9)
    {
        int nRem = inputNum, nSum = 0;
        do // checking nRem after the loop avoids one comparison operation (1st check would always evaluate to true)
        {
            nSum += nRem % 10;
            nRem /= 10;
        } while (nRem > 9);
        inputNum = nSum + nRem;
        std::cout << "The current Sum is: " << inputNum << endl; // DEBUG - Please remove this
    }
    return inputNum;
}

至于原始代码,问题是未初始化的sum变量,正如其他成员已经指出的那样--它甚至会生成编译器错误。

gc0ot86w

gc0ot86w2#

int sumDigits (int inputNum) // returns sum of digits of inputNum (works)
{
    int sum = 0; // MAKE SURE YOU INITIALIZE THIS TO 0 BEFORE ADDING VALUES TO IT!
    int inLen = to_string(inputNum).length();
    int i = inLen;
    while (inLen --)
    {
        sum += getDigit(inputNum, i);
        i --;
    }
    return sum;
}

在给变量添加值之前初始化变量,否则你可能会遇到未定义的行为。同样为了记录,添加cout行会打印出一些东西,但这不是正确的答案。

相关问题