Armstrong C代码在Windows机器上的Vs代码中给出了153的特定输出错误

zqdjd7g9  于 2023-04-07  发布在  Windows
关注(0)|答案(1)|浏览(132)

我创建了C代码来检查Armstrong数。

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

int main()
{
    // Write a program to check if a given number of n digits is Armstrong number or not.

    int n, r, sum = 0, temp, i, p = 0;
    printf("enter the number \n");
    scanf("%d", &n);
    temp = n;

    for (i = 0; n > 0; i++)
    {
        n = n / 10;
        p++;
    }
    n = temp;
    for (i = 0; n != 0; i++)
    {
        r = n % 10;
        sum = sum + pow(r, p);
        n = n / 10;
    }

    printf("sum is %d\n",sum);

    if (sum == temp)
    {
        printf("%d is a armstrong number", temp);
    }
    else
    {
        printf("%d is not a armstrong number", temp);
    }

    return 0;
}

当我在Windows机器上的Vscode中运行此代码时,它在153和1741725处给予错误的输出。
输入数字153 sum is 152 153 is not a armstrong number
我vs代码的快照

除了这两个,我发现所有的armstrong都通过运行这段代码给出了我想要的输出。
是我的代码错了,还是GCC编译器的问题?
当我在在线网站编译器上运行相同的代码时,它运行正常。它给出了我想要的正确输出。

我把这段代码发给了我的朋友,让他们在vs代码中运行这段代码。他们面临着同样的问题。但例外-它在macos机器上给出了正确的输出vs代码
所以我得出结论,它只发生在Windows机器与代码上。
经过进一步的挖掘,我发现它可能是通过使用math.h头文件发生的。我给你另一个代码示例。这是基本的十进制到二进制转换。

#include <stdio.h>
#include <math.h>
// covert decimal to binary

int main()
{
    int i, n, r, sum = 0, x;
    printf("enter decimal number to convert binary \n");
    scanf("%d", &n);

    for (i = 0; n != 0; i++)
    {
        r = n % 2;
        n = n / 2;
        x = pow(10, i);
        sum = sum + r * x;
        printf("%d \n", sum);
    }
    printf("binary is : %d \n", sum);
    return 0;
}

当我运行它时,它在45给出错误的输出

在同一时间,当我运行使用在线编译器其给出正确的输出

我的vs代码在所有其他c程序上工作正常,我在vs代码上完成了我的整个c编程。
我只是想知道这背后的问题是什么?我的代码是错误的吗?是Windows机器上的vscode的错误/bug吗?

holgip5t

holgip5t1#

人们似乎对pow()有一种奇怪的迷恋。现在学习一下:pow()不是你的朋友。不要用它来计算整数幂。特别是如果你依赖于得到精确的整数结果,不要使用它。只有在没有其他方法的时候才使用pow()
即使你想执行的求幂运算的结果可以精确地表示为double,该函数采用的通用求幂方法也可能计算出稍微不同的结果。当你将结果转换为整数时,小数部分被截断。如果有一个错误 * 远离 * 零,这对你来说是可以的。但是如果甚至存在朝向零的单个但是误差,则整数转换将产生偏离1的结果。
对于整数数学,使用乘法来计算一般幂。您可以考虑对2的幂进行位移位。这不仅更可靠,而且通常也更快。例如,以下是在没有pow()的情况下编写的十进制到伪二进制程序:

#include <stdio.h>

int main(void) {
    int n, sum = 0;

    printf("enter decimal number to convert binary \n");
    scanf("%d", &n);

    for (int i = 0, x = 1; n != 0; i += 1, x *= 10) {
        sum += x * (n % 2);
        n /= 2;
        printf("%d\n", sum);
    }
    printf("binary is : %d\n", sum);

    return 0;
}

一般来说,如果你在一个没有浮点变量的程序中包含math.h,那么你几乎肯定做错了什么。

相关问题