程序到阿姆斯特朗'n'数字的数字只给出错误的输出153

时间:2017-06-19 15:56:45

标签: c

检查Armstrong'n'个数字的程序输出错误,仅在输入为153时。

这是我的代码。

#include<stdio.h>
#include<math.h>

int main()
{
    int p, k, n, t, sum, n1, m;
    printf("Enter the number: ");
    scanf("%d", &n);
    n1=n;
    for(p=0, k=1; n/k>=1; ++p, k*=10);
    printf("\nThe number of digits: %d", p);

    for(sum=0; n>0; n/=10)
    {
        t= n%10;
        printf("\n\nThe base and power: %d and %d", t, p);
        m=pow(t, p);
        printf("\nThe calculated no is: %d", m);
        sum+=pow(t, p);
        printf("\nThe sum is: %d", sum);
    }

    printf("\n\t The original number is  : %d", n1);
    printf("\n\t The calculated number is: %d", sum);

    if(n1==sum)
        printf("\n\t%d is an armstrong number\n", n1);
    else
        printf("\n\t%d is not an armstrong number\n", n1);

    return 0;
}

程序在进行数学计算时会 152 ,因此输出错误。我打印了每一步都找到了确切的错误点。

  • 我使用过power函数而不是for循环
  • 我不能使用t * t * t,因为这个程序是针对阿姆斯壮的“n”数字,而不仅仅是3
  • 我正在使用代码块16.01
  • 编译程序

问题是,它正在计算5的立方体为124

有趣的是,当我使用power函数在一个单独的简单程序中计算5的立方体时,我得到正确答案(125)

我还检查了这里给出的代码 - &gt; https://www.programiz.com/c-programming/examples/check-armstrong-number,它也提供了错误的输出。我在本网站上找到的有些类似问题的答案并未解决问题。

2 个答案:

答案 0 :(得分:3)

好吧,我无法重现上述问题。我确实得到了输入153的正确结果,即它是阿姆斯壮的数字。

由于使用pow,可能会出现一些浮点舍入错误(尽管在这种特定情况下我会发现这很奇怪)。

对于像这样的任务,你应该使用浮点数。使用可用的最大整数类型。您不仅可以避免令人讨厌的舍入错误,还可以增加程序可以处理的输入值范围。

所以,我想谈谈这部分:

  

我不能使用t * t * t,因为这个程序适用于阿姆斯壮的“n”数字,而不仅仅是3个

您可以轻松编写使用整数数学计算t^n的函数。这是一个例子:

#include<inttypes.h>

uint64_t intpow(uint64_t t, uint64_t p)
{
    uint64_t result = 1;
    while(p>0)
    {
        result = result * t;
        --p;
    }
    return result;
} 

注意:在当前形式下,函数缺少溢出检测,因为我想保持函数简单。

答案 1 :(得分:0)

有两种解决方法。 1)使用round()函数将给出最接近的整数(因为代码块中的浮点计算存在一些错误)。

2)将sum变量声明为float或double,因为它将转换为完美的浮点精度。