Проблема определения, является ли число числом Армстронга - PullRequest
3 голосов
/ 30 мая 2011

Я пытаюсь проверить, является ли предоставленное пользователем число armstrong number .Что-то не так, и я не могу понять.

Любая помощь приветствуется.

Код прилагается ниже.

Ответы [ 7 ]

3 голосов
/ 30 мая 2011

Основная проблема заключается в том, что вы не ведете запись числа, с которого начинаете.Вы делите a на 10 несколько раз (это заканчивается как 0), а затем сравниваете 0 с 153. Они не равны.

Ваша другая проблема заключается в том, что вы не можете искать 4-значный или более Армстронгчисла, ни для однозначных, кроме 1. Ваша функция fun() будет лучше названа cube();в моем коде ниже он переименован в power(), поскольку он обобщен для обработки N-значных чисел.


Я решил, что для рассматриваемого диапазона степеней нет необходимости использоватьболее сложный алгоритм для power() - тот, который делит на два и т. д. Было бы сэкономлено 6-10-значное число, но вы не могли бы измерить его в этом контексте.Если скомпилировано с -DDEBUG, оно включает диагностическую печать, которая использовалась, чтобы убедить меня, что мой код работает правильно.Также обратите внимание, что ответ повторяет ввод;это основная техника, обеспечивающая правильное поведение.И я обернул код в функцию, чтобы проверить, является ли число числом Армстронга, которое вызывается итеративно из основной программы.Это облегчает тестирование.Я добавил проверки к scanf(), чтобы предотвратить проблемы, еще одну важную базовую технику программирования.

Я проверил большинство чисел Армстронга до 146511208, и это кажется правильным.Пара 370 и 371 интригуют.

#include <stdio.h>
#include <stdbool.h>

#ifndef DEBUG
#define DEBUG 0
#endif

static int power(int x, int n)
{
    int r = 1;
    int c = n;
    while (c-- > 0)
        r *= x;
    if (DEBUG) printf("    %d**%d = %d\n", x, n, r);
    return r;
}

static bool isArmstrongNumber(int n)
{
    int y = 0;
    int a = n;
    int p;
    for (p = 0; a != 0; a /= 10, p++)
        ;
    if (DEBUG) printf("    n = %d, p = %d\n", n, p);
    a = n;
    for (int i = 0; i < p; i++)
    {
        y += power(a % 10, p);
        a /= 10;
    }
    return(y == n);
}

int main(void)
{
    while (1)
    {
        int a;
        printf("Enter the number you want to identify as an Armstrong number or not: ");
        if (scanf("%d", &a) != 1 || a <= 0)
            break;
        else if (isArmstrongNumber(a))
            printf("%d is an Armstrong number\n", a);
        else
            printf("%d is not an Armstrong number\n", a);
    }

    return 0;
}
2 голосов
/ 30 мая 2011
#include<stdio.h>
#include <math.h>

int power(int, int);
int numberofdigits(int);

//Routine to test if input is an armstrong number.
//See: http://en.wikipedia.org/wiki/Narcissistic_number if you don't know
//what that is. 

int main()
{
    int input;
    int digit;
    int sumofdigits = 0;

    printf("enter the number you want to identify as an Armstrong or not:");
    scanf("%d",&input);

    int candidate = input;
    int digitcount = numberofdigits(input);

    for(int i=1 ; i <= digitcount ; i++) 
    {
        digit = candidate % 10;
        sumofdigits = sumofdigits + power(digit, digitcount);
        candidate = candidate / 10;
    }

    if(sumofdigits == input)
        printf("\n %d is an Armstrong number", input);
    else
        printf("\n %d is NOT an Armstrong number", input);
    return 0;
}

int numberofdigits(int n);
{
  return log10(n) + 1;
}

int power(int n, int pow)
{
  int result = n;
  int i=1;
  while (i < pow) 
  {
    result = result * n; 
    i++;
  }
}

Что не так с кодом:

  1. Не использовать значимых имен переменных , что затрудняет понимание значения кода; Помните, что код написан для людей, а не для компиляторов.
  2. Не используйте запутанный код этот код: int x,a,b,y=0; сбивает с толку, все переменные установлены в 0 или просто y. Всегда помещайте переменные, которые инициализируются, в отдельной строке. Это облегчает чтение. Пройдите лишнюю милю, чтобы быть однозначным, в конечном итоге это окупится.
  3. Используйте комментарии: Если вы не знаете, что такое армстронг, то вам будет очень сложно определить это по вашему коду. Добавьте несколько значимых комментариев, чтобы люди знали, что ваш код должен делать. Это облегчит вам и другим, потому что они знают, что вы хотели сделать и могут увидеть, что вы на самом деле сделали, и при необходимости решить проблему.
  4. использовать значимые имена процедур WTF делает fun(x) делать ?. Никогда ничего не называйте fun() это как наука без фактов, какой смысл?
  5. Не жестко кодируйте вещи , ваша рутина принимает только цифры armstrong3, но если вы можете жестко закодировать, почему бы не сделать return (input == 153) || (input == 370) || ....
2 голосов
/ 30 мая 2011

Одной из проблем может быть то, что вы меняете a (поэтому оно больше не будет иметь первоначальное значение). Также это будет соответствовать только 1, 153, 370, 371, 407. Это подсказка для замены for и проверки до тех пор, пока a не станет равным нулю, и для изменения функции на число цифр.

0 голосов
/ 26 марта 2019

Вот способ проверить, является ли число армстронгом или нет

t=int(input("nos of test cases"))
while t>0:
    num=int(input("enter any number = "))
    n=num
    sum=0
    while n>0:
        digit=n%10
        sum += digit ** 3
        n=n//10

    if num==sum:
        print("armstronng num")
    else:
        print("not armstrong")
    t-=1
0 голосов
/ 01 января 2019

Если вы пытаетесь найти число Армстронга , то в опубликованном вами решении отсутствует случай, когда ваши цифры больше 3 ... числа Армстронга могут быть больше 3 цифр (например, 9474). Вот код на Python, логика проста и может быть преобразована в любой другой язык.

def check_armstrong(number):
    num = str(number)
    total=0
    for n in range(len(num)):
        total+=sum(int(num[n]),len(num))       

    if (number == total):
        print("we have armstrong #",total)

def sum(input,power):
    input = input**power
    return input

check_armstrong(9474)
0 голосов
/ 17 сентября 2015

Чек № Армстронг или Не используется C Язык

#include<stdio.h>
#include<conio.h>
void main()
{
    A:
    int n,n1,rem,ans;
    clrscr();
    printf("\nEnter No. :: ");
    scanf("%d",&n);

    n1=n;
    ans=0;
    while(n>0)
    {
        rem=n%10;
        ans=ans+(rem*rem*rem);
        n=n/10;
    }

    if(n1==ans)
    {
        printf("\n Your Entered No. is Armstrong...");
    }
    else
    {
        printf("\n Your Entered No. is not Armstrong...");
    }

    printf("\n\nPress 0 to Continue...");
    if(getch()=='0')
    {
        goto A;
    }
    printf("\n\n\tThank You...");
    getch();
}
0 голосов
/ 27 июля 2014
/* 
Name: Rakesh Kusuma

Email Id:  rockykusuma@gmail.com

Title: Program to Display List of Armstrong Numbers in 'C' Language

*/



#include<stdio.h>

#include<math.h>

int main()

{

int temp,rem, val,max,temp1,count;

int num;

val=0;

num=1;

printf("What is the maximum limit of Armstrong Number Required: ");

scanf("%d",&max);

printf("\nSo the list of Armstrong Numbers Before the number %d are: \n",max);

while(num <=max)

    {         
        count = 0;

        temp1 = num;

        while(temp1!=0)

        {
            temp1=temp1/10;

            count++;
        }   

        if(count<3)

        count = 3;

            temp = num;

            val = 0;

            while(temp>0)

            {

                rem = temp%10;

                val = val+pow(rem,count);

                temp = temp/10;

            }

            if(val==num)

            {

                printf("\n%d", num);

            }

     num++; 

    }

 return 0;

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...