我正在尝试解决Codewars任务,面临着一个对我来说很奇怪的问题。
代码的任务是编写函数digital_root(n),对n的位数求和,直到最终结果中只有1位。例如:942 --〉9 + 4 + 2 = 15 --〉1 + 5 = 6(函数返回6)。
我写了一些庞大的代码与支持功能,请参阅代码与注解如下。
问题- digital_root函数只有当我把cout行放在while循环中时才能工作。如果没有cout行,函数返回的结果是无意义的(请参见函数代码中的注解)。
我的问题是:
1.为什么digital_root在没有cout行的情况下无法工作?
- 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。可悲。
2条答案
按热度按时间lstz6jyr1#
下面是一个使用整数运算符的实现,而不是调用
std::to_string()
和std::pow()
函数--这实际上适用于浮点数。它使用两个整数变量nSum
和nRem
,保存输入数的运行和和和余数。至于原始代码,问题是未初始化的
sum
变量,正如其他成员已经指出的那样--它甚至会生成编译器错误。gc0ot86w2#
在给变量添加值之前初始化变量,否则你可能会遇到未定义的行为。同样为了记录,添加cout行会打印出一些东西,但这不是正确的答案。