寻找数字平方和的初学者错误C ++

时间:2016-06-03 22:54:19

标签: c++

所以,我最近开始学习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头来解决这个问题。

很抱歉,如果我的代码不太可读或有组织!如果我的超长代码有任何快捷方式也会有所帮助,谢谢!

2 个答案:

答案 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没有彻底测试它,但我认为它运作正常。