Member 13368218 Ответов: 2

ЦИФРЫ АРМСТРОНГА. Проблема с моей программой - цикл работает до 149, но создает проблему, как только доходит до 150.


Число Армстронга - это n-значное число, равное сумме N-й степени его цифр.
Итак, я должен напечатать числа Армстронга от 1 до 500. в общей сложности их насчитывается 12.

программа, которую я написал, на самом деле не печатала числа Армстронга более 9. поэтому я решил проверить ее, напечатав числа, которые я получаю из упомянутой выше "суммы".
вот как я узнал, что петля работает выше 149. Всякий раз, когда он достигает 150, программа каким-то образом вычитает 1 из "суммы". ПОЖАЛУЙСТА, ПОМОГИТЕ, ТАК КАК Я ДОЛЖЕН ПРЕДСТАВИТЬ ЕГО ЧЕРЕЗ ПАРУ ДНЕЙ.

Что я уже пробовал:

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

using namespace std;

int main()
{
    int di;
    for(int a = 1, b = a, c = a, sum = 0, digi = 0;a <= 150;a++, b = a, digi = 0, c = a, sum = 0)
    {
        for(b;b != 0;b /= 10, digi++);
        do
        {
            di = c % 10;
            sum += pow(di, digi);
            c /= 10;
        }while(c != 0);
        cout << sum << " ";
        // if(sum == a) cout << sc << " ";
    }
}

Richard MacCutchan

Предложения:
- Начните с того, что дайте вашим переменным осмысленные имена, чтобы мы могли понять назначение каждой из них.
- Затем выньте все эти дополнительные выражения из ваших операторов for, чтобы мы могли понять, что они должны делать.
- Тогда добавьте несколько комментариев, чтобы код было легче понять.

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
Итак, я должен напечатать числа Армстронга от 1 до 500.

Целочисленная переменная не может содержать столько цифр. Один int не может содержать больше 10 цифр.
Вы должны изучить различные типы данных C.

Ой, ошибся между значениями и количеством цифр

for(int a = 1, b = a, c = a, sum = 0, digi = 0;a <= 150;a++, b = a, digi = 0, c = a, sum = 0)

Нет смысла набирать такой код, нет никакой выгоды, это только затруднит его чтение и понимание.
Любое увеличение количества строк кода происходит за счет читабельности.

[Обновление]
Совет: сделайте свой код более легким для чтения.
Затем используйте отладчик, чтобы увидеть, как работает ваш код, это поможет вам понять, почему он идет не так.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Graeme_Grant

Что ж... по крайней мере, сначала заставьте его работать, а потом вы сможете весело провести время, делая его как можно более трудным для чтения! ;)

Но, как совершенно справедливо сказал ppolymorphe, читабельность очень важна для других, чтобы читать и не идти WTF, когда вы вернетесь к ней через 6+ месяцев!

Patrice T

Привет,
Вы уверены, что ваш комментарий находится в нужном месте ?

Graeme_Grant

Да... просто добавляю к твоему! ;)

Patrice T

ладно

Graeme_Grant

:)

Richard MacCutchan

Речь идет о числах Армстронга между двумя целыми числами 1 и 500, поэтому не будет никаких проблем с удержанием значения, так как ни одно значение не будет больше 1522.

Patrice T

Ой, ошибся между значениями и количеством цифр :)

Richard MacCutchan

Это было бы забавное упражнение, вычисляющее значения для 500-значного числа.

Patrice T

В основном долго с грубой силой, используемой кодом :)

Graeme_Grant

Это было бы интересно!

Рейтинг:
0

RAMASWAMY EKAMBARAM

Вы можете использовать sprintf() для преобразования каждого значения (от 1 до 500) в отображаемую строку. Длина строки будет представлять собой количество цифр (т. е. показатель степени), и вычитание " 0 " из каждого символа в массиве (с помощью цикла) даст вам числовое значение, и у вас уже есть показатель степени.
Кодирование таким образом должно быть проще, и вы должны быть в состоянии " отправить в пару дни часы'.