Code :: Blocks 13.12 C ++求和的答案总和

时间:2016-09-22 18:21:05

标签: c++ c++11

刚才我用C ++编写了一个简单的函数来确定一个数字是否是自恋的,我偶然发现了一些最特殊的东西。对于数字9800817和9926315,我在函数“IsNumberNarcissistic”中获得了错误的总和,这两者都是自恋的。我得到的总和总是比它应该少1,这些数字分别是9800816和9926314。但是,将变量sum声明为double可以解决问题。

所以我的问题是,这里发生了什么?是代码:阻止相关问题,还是其他什么?我正在使用Code:Blocks 13.12。提前谢谢。

PS。不要介意我在函数中创建的那些打印,我只是把它们放在那里看变量值。

    #include <iostream>
    #include <vector>
    #include <cmath>
    #include <iomanip>

    using std::cin; using std::cout; using std::endl;

    std::vector<int> extractDigits(int n)
    {
        std::vector<int> digits;
        while (n>0)
        {
            digits.push_back(n%10);
            n/=10;
        }
        return digits;
    }

    bool IsNumberNarcissistic(int n)
    {
        auto digits = extractDigits(n);
        int sum(0);
        int power = digits.size();
        for (int digit : digits) sum += std::pow(digit, power);
        for (int digit : digits) cout << std::setprecision(10)     
        << std::pow(digit, power) << endl;
        cout << endl << endl << sum;
        return (sum == n);
    }

    int main()
    {
        IsNumberNarcissistic(9800817);
    }

1 个答案:

答案 0 :(得分:0)

评论者已经回答了你的问题,所以我正在标记这个社区Wiki。

我从来没有听说过自恋数字,所以我制作了一个适合你的代码的版本,以便稍微探讨一下这个主题。

std::pow被我的IPow取代,这是一个整数取幂函数,它使用标准的二进制数字/平方技术。

#include <iostream>
#include <vector>

std::vector<int> ExtractDigits(int n) {
    std::vector<int> digits;
    if(n < 0) { n = -n; }
    do {
        digits.push_back(n % 10);
    } while(n /= 10); // 0 has 1 digit
    return digits;
}

int IPow(int b, int e) {
    if(e < 0) return 0; // truncated fraction
    int s = b;
    int r = 1;
    while(e) {
        if(e % 2) { r *= s; }
        s *= s;
        e /= 2;
    }
    return r;
}

bool IsNumberNarcissistic(int n) {
    const auto digits = ExtractDigits(n);
    int sum = 0;
    const int power = digits.size();
    for (int digit : digits) { sum += IPow(digit, power); }
    for (int digit : digits) { 
        std::cout << digit << "**" << power << " " << IPow(digit, power) << '\n';
    }
    std::cout << "sum: " << sum << '\n';
    return sum == n;
}

int main() {
    for(int n : { 9800817, 9800818, 50 }) {
        std::cout << n << " is" << (IsNumberNarcissistic(n) ? "" : " not") 
            << " Narcissistic\n\n";
    }
}

输出

7**7 823543
1**7 1
8**7 2097152
0**7 0
0**7 0
8**7 2097152
9**7 4782969
sum: 9800817
9800817 is Narcissistic

8**7 2097152
1**7 1
8**7 2097152
0**7 0
0**7 0
8**7 2097152
9**7 4782969
sum: 11074426
9800818 is not Narcissistic

0**2 0
5**2 25
sum: 25
50 is not Narcissistic