Печать чисел Армстронга в C

Это программа для нахождения числа Армстронга в диапазоне от 1 до 1000 (сумма кубов каждой цифры числа равна самому числу). Она печатает некоторые числа правильно, но не печатает 153. Мой вопрос в том, почему этот случай 153 исключен? Заранее спасибо.

#include<stdio.h>
#include<math.h>
void main()
{
    int i,save,rem;
    for(i=1;i<1000;i++)
    {
        int s=0;
        int save=i;                        /*Creating copy of the 
                                           variable i.*/
        while(save!=0)
        {
            rem=save%10;
            save/=10;
            s+=pow(rem,3.0);
        }
        if(i==s)                           //Comparing i with the sum.
            printf("\n%d",i);              //Printing armstrong number.
    }
}

Снимок экрана окна вывода


person yash gandhi    schedule 26.01.2019    source источник
comment
Не думаете ли вы, что все однозначные числа также должны быть в выводе?   -  person Brij Raj Kishore    schedule 26.01.2019
comment
Ну, я не знаю, какой компилятор вы используете, но он печатает 153. См. здесь ide.geeksforgeeks.org/PN0grwbAFI   -  person Brij Raj Kishore    schedule 26.01.2019
comment
Лучше использовать s += rem * rem * rem; и избегать pow, который возвращает двойное число, а округление может привести к тому, что оно будет немного меньше, чем i, что приведет к сбою сравнения. я получаю 1, 153, 370, 371, 407   -  person David C. Rankin    schedule 26.01.2019
comment
Не используйте pow для целых чисел. Он вычисляет значения, используя арифметику с плавающей запятой, которая может иметь ошибку с плавающей запятой. Просто используйте rem * rem * rem вместо этого.   -  person BessieTheCookie    schedule 26.01.2019
comment
Объявляйте переменные только тогда, когда они вам нужны, и не используйте их повторно.   -  person BessieTheCookie    schedule 26.01.2019


Ответы (2)


Я внес некоторые изменения в вашу программу, такие как печать однозначных чисел, поскольку они являются числами Армстронга иизбегание функции мощности с плавающей запятой и другие незначительные изменения, которые можно увидеть в комментарии к коду.

#include<stdio.h>
#include<math.h>
void main()
{
    int i,save,rem;
    for(i=1; i<= 1000;i++)
    {
        int s=0;
        int save=i;                        /*Creating copy of the    variable i.*/
        while(save!=0)
        {
            rem=save%10;
            save/=10;
            int temp = rem;
            for(int j = 1; j < 3; ++j) {  // power function
                rem = rem * temp;
            }
            s+=rem;
        }
        if(i==s)                           //Comparing i with the sum.
            printf("%d\n",i);              //Printing armstrong number.
    }
}

Выход

1 153 370 371 407

Изменить: Я внес изменения в соответствии с OP, определяющим число Армстронга

person Brij Raj Kishore    schedule 26.01.2019
comment
Как 3^3 = 3? - person RJM; 26.01.2019
comment
Я думаю, вы неправильно поняли определение чисел Армстронга. oeis.org/A005188 - person Brij Raj Kishore; 26.01.2019
comment
В заданном числе, если мы вычислим сумму каждого (цифры) ^ (количество цифр этого числа), тогда полученное число будет таким же, как заданное число, тогда это армстронг. Таким образом, 1 ^ 1 = 1, 2 ^ 1 = 2, 3 ^ 1 = 3 и так далее. Для трехзначного числа 153 = 1^3 + 5^3 + 3^3. Аналогично для 4-значного числа, например: 1634 = 1 ^ 4 + 6 ^ 4 + 3 ^ 4 + 4 ^ 4 - person Brij Raj Kishore; 26.01.2019
comment
Вы правы, но это не то, как это определяет пост. В посте указан куб цифр. По сути, это 1 и 3-значные числа Армстронга. - person RJM; 26.01.2019
comment
Итак, хорошо, мне просто нужно внести некоторые изменения. - person Brij Raj Kishore; 26.01.2019
comment
Неясно, действительно ли ОП хотел, чтобы все номера Армстронга были только теми, которые указаны в посте. - person RJM; 26.01.2019

Использование gcc в Windows 7 работает с pow. Однако этот код может помочь вам избежать округления с помощью pow().

Этот код также упрощает зацикливание и устраняет повторное объявление сохранения.

#include <stdio.h>

int main(void) {

    int i, sum, ones, tens, hunds;
    for(i = 1; i < 1000; i++) {

        sum = i/10;
        ones = i%10;
        tens = sum%10;
        hunds = sum/10;

        sum = ones*ones*ones + tens*tens*tens + hunds*hunds*hunds;


        if(i == sum)
            printf("\n%d", i);

    }

}

РЕДАКТИРОВАТЬ

Судя по комментариям @Brij Raj Kishore, в случае, если пост действительно предназначался для отображения всех номеров Армстронга 1-1000, замените приведенный выше цикл for на следующий.

for(i = 1; i < 1000; i++) {

    sum = i/10;
    ones = i%10;
    tens = sum%10;
    hunds = sum/10;

    if(!(hunds | tens))
        sum = ones;
    else if (hunds == 0 && tens != 0)
        sum = ones*ones + tens*tens;
    else
        sum = ones*ones*ones + tens*tens*tens + hunds*hunds*hunds;

    if(i == sum)
        printf("\n%d", i);

}
person RJM    schedule 26.01.2019