我创建了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吗?
1条答案
按热度按时间holgip5t1#
人们似乎对
pow()
有一种奇怪的迷恋。现在学习一下:pow()
不是你的朋友。不要用它来计算整数幂。特别是如果你依赖于得到精确的整数结果,不要使用它。只有在没有其他方法的时候才使用pow()
。即使你想执行的求幂运算的结果可以精确地表示为
double
,该函数采用的通用求幂方法也可能计算出稍微不同的结果。当你将结果转换为整数时,小数部分被截断。如果有一个错误 * 远离 * 零,这对你来说是可以的。但是如果甚至存在朝向零的单个但是误差,则整数转换将产生偏离1的结果。对于整数数学,使用乘法来计算一般幂。您可以考虑对2的幂进行位移位。这不仅更可靠,而且通常也更快。例如,以下是在没有
pow()
的情况下编写的十进制到伪二进制程序:一般来说,如果你在一个没有浮点变量的程序中包含
math.h
,那么你几乎肯定做错了什么。