числа Армстронга. Не подходит для 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;
}

Вывод скриншота


person Al2110    schedule 01.01.2020    source источник
comment
Я вижу 153 напечатано   -  person P0W    schedule 01.01.2020
comment
pow — это функция с плавающей запятой, и поэтому она будет иметь ошибки округления. Почему бы вместо этого не использовать простое целочисленное умножение, как в *iter * *iter * *iter?   -  person Some programmer dude    schedule 01.01.2020
comment
Ваш код работает отлично для меня!   -  person MH304    schedule 01.01.2020
comment
Странный. У меня не работает, скрин добавил в пост.   -  person Al2110    schedule 01.01.2020


Ответы (2)


Это не похоже на ваш лучший вариант:

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
> 
person cdlane    schedule 02.01.2020

person    schedule
comment
Не используйте pow вместо ints. - person Asteroids With Wings; 20.12.2020