c语言编程中的阿姆斯特朗数

cyvaqqii  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(121)

我用C语言编写了一个程序来判断一个整数是否是三位数的Armstrong number。如果用户给出的数字是Armstrong数,则打印it is an armstrong number,如果不是Armstrong数,则打印its not an armstrong number。它没有显示任何错误。它也适用于所有三位数字,除了一个数字。它是153。这是打印,它不是一个阿姆斯特朗数,即使它是一个阿姆斯特朗数。有谁能告诉我这里出了什么问题吗?
下面是代码和输出:

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

int main() {

    int sum = 0;
    int n;

    //asking the user to enter a number
    printf("Enter a number : ");
    scanf("%d", &n);

    // copying the value of n in a variable b
    int b = n;

    while (n != 0) {
        // storing the reminders of n divided by 10 in a variable
        int r = n % 10;
    
        // finding the power 
        sum = pow(r, 3) + sum;
        n = n / 10;
    }
    // here I am printing the sum just to show you guys what is the answer i am getting
    printf("%d\n", sum);

    // if sum equals to b, then do this
    if (sum == b) {
        printf("The number is an armstrong number\n");
    }
    // if not then do this
    else {
        printf("It is not an armstrong number\n");
    }
}

下面是我输入一个三位数的Armstrong数时得到的输出:

Enter a number : 370
370
The number is an armstrong number

Enter a number : 407
407
The number is an armstrong number

这里我输入了一个不是阿姆斯特朗数的数:

Enter a number : 100
1
It is not an armstrong number

153是阿姆斯特朗数。下面是我输入153时发生的情况:

Enter a number : 153
152
It is not an armstrong number

它说153 is not a armstrong number。为什么会发生这种情况?我该如何解决这个问题?

nhhxz33t

nhhxz33t1#

标准C库中的pow实现是有缺陷的,即使数学结果可以精确表示,它也会返回近似值。
别再用它来做立方体了。将pow(r,3)替换为r*r*r

xhv8bpkk

xhv8bpkk2#

你的代码可以在gcc编译器上运行。自己查https://godbolt.org/z/Pvo19xrxx
正如其他人提到的那样,使用r*r*r而不是pow。

inkz8wg9

inkz8wg93#

#include<stdio.h>

#include<math.h>

int main(){

    int num;
    printf("Please enter a three digit number: ");
    scanf("%d",&num);
    //Taking input
    int a = (num - (num % 100) );
    int hu = a/100;
    //Finding hundreds digit
    int b = num - a - (num % 10) ;
    int te = b/10;
    //Finding tens digit
    int un = num - a - b;
    //Finding units digit
    printf("hu = %d\n", hu);
    printf("te = %d\n", te);
    printf("un = %d\n", un);
    //Conditional forms
    //Use of pow is allowed through math.h header file
    if(num == pow(hu, 3) + pow(te,3)+ pow(un, 3)){
        printf("The entered number is an armstrong number");
    }
    else if(num != pow(hu, 3) + pow(te,3), pow(un, 3)){
        printf("The entered number is not an armstrong number");
    }   
}
mv1qrgav

mv1qrgav4#

问题可能与系统上pow()函数的实现有关。除非实现者对整数参数进行了特殊处理,否则pow(x, n)可以计算为exp(log(x) * n),这可能会产生略小于预期整数结果的结果,因为log(5)不能精确地表示为浮点数(即:124,999999999999而不是125)。转换为int是作为小数部分的截断执行的,因此是124而不是125
不同的实现可能会产生稍微不同的结果,这取决于它们如何处理整数参数。这就解释了为什么你观察到一个问题,而其他系统上的人却没有。
有两种方法可以避免这个陷阱:

  • 使用round(pow(r, 3))来确保结果是最接近的整数,以防它不是预期的整数。
  • 使用r * r * r,这是用整数运算执行的。

下面是后一种方法的修改版本:

#include <stdio.h>

int main(void) {

    int n = 0;

    //asking the user to enter a number
    printf("Enter a number : ");
    if (scanf("%d", &n) != 1)
        return 1;

    // copying the value of n in a temporary variable b
    int b = n;
    int sum = 0;

    while (n != 0) {
        // storing the reminders of n divided by 10 in a variable
        int r = b % 10;
    
        // finding the power 
        sum = r * r * r + sum;
        b = b / 10;
    }
    // here I am printing the sum just to show you guys what is the answer I am getting
    printf("%d\n", sum);

    // if sum equals to b, then do this
    if (sum == n) {
        printf("The number is an armstrong number\n");
    } else {
        // if not then do this
        printf("It is not an armstrong number\n");
    }
    return 0;
}

相关问题