计算一个数字是否为阿姆斯特朗数时得到错误的输出

问题描述 投票:0回答:1

我只是在尝试一个代码来查找一个数字是否是阿姆斯特朗数字。但即使它是阿姆斯特朗数,所有输入都会得到相同的输出。所以我使用了在线编译器并且它起作用了。

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

int main() {
    int originalNum, num, lastDigit, digits, sum;

    /* Input number from user */
    printf("Enter any number to check Armstrong number: ");
    scanf("%d", &num);

    sum = 0;
    originalNum = num;

    /* Calculate the number of digits in the input number */
    for (digits = 0; originalNum > 0; digits++) {
        originalNum /= 10;
    }

    originalNum = num;

    /* Compute the sum of the cubes of individual digits */
    while (originalNum > 0) {
        lastDigit = originalNum % 10;
        sum += pow(lastDigit, digits);
        originalNum /= 10;
    }

    /* Check if the sum equals the original number */
    if (sum == num) {
        printf("%d is an Armstrong number.\n", num);
    } else {
        printf("%d is not an Armstrong number.\n", num);
    }

    return 0;
}
c visual-studio-code
1个回答
1
投票

在这一行中:

sum += pow(lastDigit, digits);

您使用

pow
,它是浮点值函数,而不是整数函数。请在此处查看更多信息:pow 函数的奇怪行为

相反,您应该使用基于整数的幂运算。 这篇文章提出了一种使用以下函数的有效方法:

int ipow(int base, int exp)
{
    int result = 1;
    for (;;)
    {
        if (exp & 1)
            result *= base;
        exp >>= 1;
        if (!exp)
            break;
        base *= base;
    }

    return result;
}

然后:

sum += ipow(lastDigit, digits);

旁注:
您应该检查

scanf
的返回值(在您的情况下应该为 1)以验证您是否获得了正确的输入。

© www.soinside.com 2019 - 2024. All rights reserved.