作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试检查用户提供的号码是否为 armstrong number .不过出了点问题,我想不通。
感谢任何帮助。
下面附上代码。
#include<stdio.h>
int fun(int);
int main()
{
int x,a,b,y=0;
printf("enter the number you want to identify is aN ARMSTRONG OR NOT:");
scanf("%d",&a);
for(int i=1 ; i<=3 ; i++)
{
b = a % 10;
x = fun(b);
y = x+y;
a = a/10;
}
if(y==a)
printf("\narmstrong number");
else
printf("\nnot an armstrong number");
return 0;
}
int fun(int x)
{
int a;
a=x*x*x;
return (a);
}
最佳答案
主要问题是您没有记录开始时使用的号码。你将 a
重复除以 10(它以 0 结尾),然后将 0 与 153 进行比较。它们不相等。
你的另一个问题是你不能寻找 4 位或更长的阿姆斯壮数字,也不能寻找 1 以外的 1 位数字。你的函数 fun()
最好命名为 立方体()
;在我下面的代码中,它被重命名为 power()
因为它被泛化为处理 N 位数字。
我决定,对于所考虑的权力范围,没有必要为 power()
使用更复杂的算法 - 除以二等。这样可以节省6-10 位数字,但您无法在这种情况下对其进行测量。如果使用 -DDEBUG
进行编译,它会包含诊断打印 - 它用于让我确信我的代码工作正常。另请注意,答案与输入相呼应;这是确保您获得正确行为的基本技术。我将代码封装到一个函数中,以测试一个数字是否是阿姆斯特朗数字,该函数从主程序中迭代调用。这使得测试更容易。我在 scanf()
中添加了检查以防止出现问题,这是另一种重要的基本编程技术。
我已经检查了最多为 146511208 的大多数阿姆斯特朗号码,它似乎是正确的。 370 和 371 这对很有趣。
#include <stdio.h>
#include <stdbool.h>
#ifndef DEBUG
#define DEBUG 0
#endif
static int power(int x, int n)
{
int r = 1;
int c = n;
while (c-- > 0)
r *= x;
if (DEBUG) printf(" %d**%d = %d\n", x, n, r);
return r;
}
static bool isArmstrongNumber(int n)
{
int y = 0;
int a = n;
int p;
for (p = 0; a != 0; a /= 10, p++)
;
if (DEBUG) printf(" n = %d, p = %d\n", n, p);
a = n;
for (int i = 0; i < p; i++)
{
y += power(a % 10, p);
a /= 10;
}
return(y == n);
}
int main(void)
{
while (1)
{
int a;
printf("Enter the number you want to identify as an Armstrong number or not: ");
if (scanf("%d", &a) != 1 || a <= 0)
break;
else if (isArmstrongNumber(a))
printf("%d is an Armstrong number\n", a);
else
printf("%d is not an Armstrong number\n", a);
}
return 0;
}
关于c - 确定一个数字是否为阿姆斯壮数字的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6170411/
我是一名优秀的程序员,十分优秀!