所以,我最近开始学习C ++。此代码试图添加每个数字数字的平方和。例如:243:2 * 2 + 4 * 4 + 3 * 3 = 29。
int sumOfSquareDigits(int n) //BUG WITH INPUT OF 10, 100, 1000, etc.
{
int digits = findDigits(n);
int number;
int remainder;
int *allDigits = new int[digits];
for (int i = 0; i < digits; i++) { //assigns digits to array
if (i + 1 == digits){ //sees if there is a ones value left
allDigits[i] = n;
}
else {
remainder = (n % findPower10(digits - (i + 1)));
number = ((n - remainder) / findPower10(digits - (i + 1)));
allDigits[i] = number; //records leftmost digit
n = n - (allDigits[i] * findPower10(digits - (i + 1))); //gets rid of leftmost number and starts over
}
}
int result = 0;
for (int i = 0; i < digits; i++) { //finds sum of squared digits
result = result + (allDigits[i] * allDigits[i]);
}
delete [] allDigits;
return result;
}
int findDigits(int n) //finds out how many digits the number has
{
int digits = 0;
int test;
do {
digits++;
test = findPower10(digits);
} while (n > test);
return digits;
}
int findPower10(int n) { //function for calculating powers of 10
int result = 1;
for (int i = 0; i < n; i++)
result = result * 10;
return result;
}
运行代码之后,我发现它(几乎没有)大部分都可以运行。我发现只要用户输入值10,100,1000等,它总是返回值100.我只想使用iostream头来解决这个问题。
很抱歉,如果我的代码不太可读或有组织!如果我的超长代码有任何快捷方式也会有所帮助,谢谢!
答案 0 :(得分:2)
问题出在findDigits
函数中。对于值10,100,1000等,它计算数字减1。这是因为循环中的比较,当n
小于或等于test
时您停止,但在这些情况下n
等于test
并且您应该运行下一次迭代。
所以,你应该改变第33行:
} while (n > test);
为:
} while (n >= test);
现在,它应该工作得很好。但它不适用于负数(我不知道这是必需的,但解决方案也适用于那种情况)。
我提出了一个更简单的解决方案:
int sumOfSquareDigits(int n)
{
// Variable to mantain the total sum of the squares
int sum = 0;
// This loop will change n until it is zero
while (n != 0) {
/// The current digit we will calculate the square is the rightmost digit,
// so we just get its value using the mod operator
int current = n % 10;
// Add its square to the sum
sum += current*current;
// You divide n by 10, this 'removes' one digit of n
n = n / 10;
}
return sum;
}
答案 1 :(得分:1)
我发现问题具有挑战性,可以将代码减少到以下几行:
long long sumOfSquareDigits(long long i) {
long long sum(0L);
do {
long long r = i % 10;
sum += (r * r);
} while(i /= 10);
return sum;
}
Haven没有彻底测试它,但我认为它运作正常。