阿姆斯壮的数字。失败 153

Armstrong numbers. Fails for 153

一个 C++ 程序,用于计算和显示 100 到 999 之间的所有阿姆斯特朗数(每个数字的总和的位数次方等于该数)。答案应该是 153, 370, 371, 407。除了 153 之外,它都打印出来。

调试完成以查看 i = 153 的各个数字的值。

#include <iostream>
#include <vector>
#include <math.h>

void separateDigits(int n, std::vector<int>& digits)
{
    if (n>0)
    {
        separateDigits(n/10, digits);
        digits.push_back(n%10);
    }
}

int main()
{
    for (int i = 100; i <= 999; i++)
    {
        std::vector<int> test;
        separateDigits(i, test);

        int powerSum = 0;
        for (auto iter = test.begin(); iter != test.end(); iter++)
        {
            //powerSum = powerSum + pow((*iter),3);
            powerSum = powerSum + (*iter)*(*iter)*(*iter);
        }

        if (i==powerSum)
        {
            std::cout << "Armstrong: " << i << std::endl;
        }

    }


    return 0;
}

这似乎不是您的最佳选择:

powerSum = powerSum + (*iter)*(*iter)*(*iter);

因为您现在已经嵌入了之前的常量 3:

powerSum = powerSum + pow((*iter),3);

以一种更加晦涩的方式。为什么不考虑一种更简洁的方式,它也支持三位数以外的尺寸数字:

    unsigned digitsSize = test.size();

    for (auto iter = test.begin(); iter != test.end(); iter++)
    {
        unsigned power = 1;

        for (unsigned size = 0; size < digitsSize; size++) {
            power *= *iter;
        }

        powerSum += power;
    }

完整代码:

#include <iostream>
#include <vector>

void separateDigits(unsigned number, std::vector<unsigned>& digits)
{
    while (number > 0)
    {
        digits.push_back(number % 10);
        number /= 10;
    }
}

int main()
{
    std::vector<unsigned> digits;

    for (unsigned number = 100; number <= 999; number++)
    {
        separateDigits(number, digits);

        unsigned powerSum = 0, digitsSize = digits.size();

        for (std::vector<unsigned>::iterator iter = digits.begin(); iter != digits.end(); iter++)
        {
            unsigned power = 1;

            for (unsigned size = 0; size < digitsSize; size++) {
                power *= *iter;
            }

            powerSum += power;
        }

        if (number == powerSum)
        {
            std::cout << "Armstrong: " << number << std::endl;
        }

        digits.clear();
    }

    return 0;
}

将范围从 100 - 999 更改为 1000 - 9999,不再破坏代码,而是生成:

> ./a.out
Armstrong: 1634
Armstrong: 8208
Armstrong: 9474
> 
#include <stdio.h> //PROGRAM TO FIND ARMSRONG NUMBERS.
#include <math.h>  //WORKS ONLY FOR THREE DIGIT NUMBERS.

int main()
{
int num, dig1, dig2, dig3;
for (num = 1; num <= 999; num++)
{

    dig3 = dig2 = dig1 = 0;
    dig3 = num % 10;
    dig2 = ((num - dig3) % 100) / 10;
    dig1 = (num - (dig3 + 10 * dig2)) / 100;
    if (num == pow(dig1, 3) + pow(dig2, 3) + pow(dig3, 3))
    {
        printf("%d\n", num);
    }
}
return 0;
}