我是C的初学者。这是我的代码来检查一个数字是否是阿姆斯特朗,但它说not armstrong
的每一个数字。
我真的没有什么东西可以留下来,但stackoverflow说:“看起来你的帖子主要是代码;请添加更多细节。”因此多了这一行。
#include <stdio.h>
#include <conio.h>
#include <stdbool.h>
#include <math.h>
int count_digits(int num)
{
int count;
for (count = 0; num != 0; count++)
{
num /= 10;
}
return count;
}
bool check_armstrong(int num, int num_length)
{
int sum;
int digit = 0;
int temp_num = num;
for (int sum = 0; temp_num != 0;)
{
digit = temp_num % 10;
temp_num /= 10;
sum += pow(digit, num_length);
}
if (sum == num)
{
return true;
}
return false;
}
int main()
{
int input_num;
printf("Enter a number: ");
scanf("%d", &input_num);
if (check_armstrong(input_num, count_digits(input_num)))
{
printf("It is an armstrong number.");
}
else
{
printf("It is not an armstrong number.");
}
getch();
return 0;
}
3条答案
按热度按时间cunj1qz11#
你的程序失败的原因是相当微妙的:
在
check_armstrong
函数中,您在函数体的开头用int sum;
定义了sum
,但在for
循环中重新定义了另一个变量sum
:for (int sum = 0; temp_num != 0;) { ... }
。这是两个独立的变量,第二个变量的作用域仅限于for
循环。因此,一旦循环结束,计算值就会丢失,并且与num
比较的sum
变量是初始变量,顺便说一下,它仍然未初始化。这就解释了函数失败和行为实际上是未定义的,所以函数输出是不可预测的,任何其他事情都可能发生。删除
for
循环中的int
:for (sum = 0; temp_num != 0;)
或更好的初始化sum
为0
并使用不同的循环变量。为了避免此类错误,您应该在启用所有警告的情况下进行编译:
gcc -Wall -Wextra -Werror
。当代码看起来不一致或使用不寻常的结构时,编译器会抱怨潜在的编程错误。在这种情况下,编译器会报告for (int sum; ...)
隐藏了已定义的sum
变量,而sum == num
具有未定义的行为,因为sum
未初始化。还建议使用整数运算而不是
pow
函数,或者至少在转换为int
之前使用round()
,以避免将小数部分截断的隐式double
到int
转换。以下是修改后的版本:
hjzp0vay2#
有一些语法错误和缺少的函数定义需要解决,以便程序正确工作。
klsxnrf13#
在check_armstrong函数中,你应该在for循环变量中的sum变量之前删除int关键字,因为它已经被标记了。代码将正常工作。希望这对你有帮助。