代码::块13.12c和#x2B+;给出错误答案的整数之和 刚才我写了一个C++的简单函数,确定一个数字是否自恋,我偶然发现了一些最奇怪的东西。对于9800817和9926315这两个自恋的数字,我在函数“IsNumberArcAssistic”中得到了错误的和。我得到的和总是比它应该的少1,分别是9800816和9926314。但是,将变量sum声明为double可以解决问题

代码::块13.12c和#x2B+;给出错误答案的整数之和 刚才我写了一个C++的简单函数,确定一个数字是否自恋,我偶然发现了一些最奇怪的东西。对于9800817和9926315这两个自恋的数字,我在函数“IsNumberArcAssistic”中得到了错误的和。我得到的和总是比它应该的少1,分别是9800816和9926314。但是,将变量sum声明为double可以解决问题,c++,c++11,C++,C++11,所以我的问题是,这里发生了什么?是代码:与块相关的问题,还是其他问题?我正在使用代码:Blocks 13.12。先谢谢你 别介意我在函数中做的那些打印,我只是把它们放在那里看变量值 #include <iostream> #include <vector> #include <cmath> #include <iomanip> using std::cin; using std::cout; using s

所以我的问题是,这里发生了什么?是代码:与块相关的问题,还是其他问题?我正在使用代码:Blocks 13.12。先谢谢你

别介意我在函数中做的那些打印,我只是把它们放在那里看变量值

    #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);
    }
#包括
#包括
#包括
#包括
使用std::cin;使用std::cout;使用std::endl;
标准::向量抽取数字(整数n)
{
向量数字;
而(n>0)
{
数字。推回(n%10);
n/=10;
}
返回数字;
}
bool是数字辅助(int n)
{
自动位数=提取位数(n);
整数和(0);
整数幂=digits.size();
对于(整数位数:位数)和+=标准::功率(位数,功率);

对于(int-digit:digits)cout评论者已经回答了您的问题,所以我正在标记这个社区Wiki

我从来没有听说过自恋数字,所以我制作了一个版本的代码,它可以正常工作,以便稍微探索一下这个主题

std::pow
被my
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";
    }
}

“是代码:与块相关的问题,还是其他问题?”我想说的另一个问题。IDE很少是罪魁祸首。更多的是与使用的目标平台和工具链相关。请记住,这是一个浮点函数,因此可能会导致舍入问题。最有可能的问题来自sum+=std::pow(数字,电源)
。听起来你可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,你可以逐行执行你的程序,看看它偏离了你的预期。如果你要做任何编程,这是一个必不可少的工具。进一步阅读:没有问题,但不要使用
std::endl
除非你需要额外的东西。
“\n”
结束一行。@PaulMcKenzie,谢谢。我没有正确阅读函数pow的文档,这是我最大的错误。