C程序来检查一个数字是否是armstrong不会工作

mxg2im7a  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(104)

我是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;
}
cunj1qz1

cunj1qz11#

你的程序失败的原因是相当微妙的:
check_armstrong函数中,您在函数体的开头用int sum;定义了sum,但在for循环中重新定义了另一个变量sumfor (int sum = 0; temp_num != 0;) { ... }。这是两个独立的变量,第二个变量的作用域仅限于for循环。因此,一旦循环结束,计算值就会丢失,并且与num比较的sum变量是初始变量,顺便说一下,它仍然未初始化。这就解释了函数失败和行为实际上是未定义的,所以函数输出是不可预测的,任何其他事情都可能发生。
删除for循环中的intfor (sum = 0; temp_num != 0;)或更好的初始化sum0并使用不同的循环变量。
为了避免此类错误,您应该在启用所有警告的情况下进行编译:gcc -Wall -Wextra -Werror。当代码看起来不一致或使用不寻常的结构时,编译器会抱怨潜在的编程错误。在这种情况下,编译器会报告for (int sum; ...)隐藏了已定义的sum变量,而sum == num具有未定义的行为,因为sum未初始化。
还建议使用整数运算而不是pow函数,或者至少在转换为int之前使用round(),以避免将小数部分截断的隐式doubleint转换。
以下是修改后的版本:

#include <math.h>
#include <stdio.h>
#include <stdbool.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 = 0;
    for (int temp_num = num; temp_num != 0; temp_num /= 10) {
        int digit = temp_num % 10; 
        sum += (int)round(pow(digit, num_length)); 
    }
    return sum == num;
}

int main(void) {
    int input_num;
    printf("Enter a number: ");
    if (scanf("%d", &input_num) != 1) {
        printf("Invalid input.\n");
        return 1;
    }
    
    if (check_armstrong(input_num, count_digits(input_num))) {
        printf("%d is an Armstrong number.\n", input_num);
    } else {
        printf("%d is not an Armstrong number.\n", input_num);
    }

    getchar();  // read the pending newline
    getchar();  // wait for more input so the program output stays visible
    return 0;
}
hjzp0vay

hjzp0vay2#

有一些语法错误和缺少的函数定义需要解决,以便程序正确工作。

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

int count_digits(int num) {
    int count = 0;
    while (num != 0) {
        num /= 10;
        count++;
    }
    return count;
}

bool check_armstrong(int num, int num_length) {
    int sum = 0;
    int digit = 0;
    int temp_num = num;
    
    while (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.\n");
    } else {
        printf("It is not an Armstrong number.\n");
    }

    return 0;
}
klsxnrf1

klsxnrf13#

在check_armstrong函数中,你应该在for循环变量中的sum变量之前删除int关键字,因为它已经被标记了。代码将正常工作。希望这对你有帮助。

相关问题