1.输入一个数判断是否是水仙花数,并输出100---999之间所有的水仙花数
水仙花数(Narcissistic number),也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。以下是关于水仙花数的详细解释:
(1)定义
- 水仙花数是一个N位正整数(N≥3),其每个位上的数字的N次幂之和等于该数本身。
- 例如,153是一个三位数的水仙花数,因为1^3 + 5^3 + 3^3 = 153。
(2)特性
- 水仙花数是自幂数的一种特殊情况,即一个数的每个位上的数字的幂之和等于它本身。
- 随着位数的增加,符合条件的水仙花数数量会减少。例如,十进制自然数中所有的水仙花数共有88个,但其中只有4个是三位数(153、370、371、407)。
- 水仙花数的位数N不能大于9,因为一个正整数的每个位上的数字的N次幂之和最大为9的9次幂,即387420489,而9位数的最大值为999999999,已经超过了9的9次幂。
(3)求解方法
- 可以通过编程遍历指定范围内的所有数,对每个数进行分解,并计算其每个位上的数字的N次幂之和,然后判断该和是否等于原数本身。
- 在C语言中,可以通过编写函数来判断一个数是否为水仙花数,并遍历100到999之间的所有数来找出所有的三位水仙花数。
(4)代码实现
cpp
#include<stdio.h>
int narcissisYesOrNot(int data)
{
int origion_number = data;
int digit_number = 0;
int digit_value;
int digit_power = 1;
int result = 0;
while(data != 0){ //判断输入数据的位数,存储在digit
data /= 10;
digit_number++;
}
data = origion_number; //经过位数判断,data值已经改变,将data原始值重新赋给data
while(data != 0 ){
digit_value = data%10;
digit_power = 1; //digit_power值由于上一轮循环有初值,在进入下一次循环之前需要重新赋1
for(int j=1;j <= digit_number;j++){ //循环计算对应位数的幂值
digit_power *= digit_value;
}
result += digit_power; //累加每一位对应的幂值
data /= 10; //去掉末位数,以求下一位值
}
return (result == origion_number);
}
int main()
{
int i;
int data;
printf("请输入一个数:\n");
scanf("%d",&data);
if(narcissisYesOrNot(data)){
printf("你输入的数%d是水仙花数\n",data);
}else{
printf("你输入的数%d不是水仙花数\n",data);
}
for(i=100;i<=999;i++){
if(narcissisYesOrNot(i)){
printf("在100---999中%d是水仙花数\n",i);
}
}
return 0;
}
输出将是:
cpp
请输入一个数:
370
你输入的数370是水仙花数
在100---999中153是水仙花数
在100---999中370是水仙花数
在100---999中371是水仙花数
在100---999中407是水仙花数
2.C语言中n次幂值的计算
在水仙花数的计算中,涉及到了数值N次幂的计算,上述代码使用的是最直接的循环,在这里我想总结一下。
(1)使用循环
最直接的方法是使用循环来累乘。这种方法简单易懂,但效率不是最高的,特别是对于大数。
cpp
#include <stdio.h>
long long power(int base, int n)
{
long long result = 1;
while (n > 0) {
if (n % 2 == 1) {
result *= base;
}
base *= base;
n /= 2;
}
return result;
}
int main()
{
int base = 2, n = 10;
printf("%d to the power of %d is %lld\n", base, n, power(base, n));
return 0;
}
注意,上面的power
函数实现了一个优化版本的幂运算,它基于二进制快速幂算法(也被称为平方乘算法)。这种方法将幂运算的时间复杂度降低到对数级别。
(2)使用math.h库
如果你的环境中支持标准C库,那么你可以使用<math.h>
库中的pow
函数来计算幂。这个方法很方便,但需要注意pow
函数的参数和返回值都是double
类型,所以如果你需要处理大整数或者需要精确的小数结果,这可能是个好选择。
cpp
#include <stdio.h>
#include <math.h>
int main() {
double base = 2.0, n = 10.0;
double result = pow(base, n);
printf("%.0f to the power of %.0f is %.0f\n", base, n, result);
return 0;
}
注意,如果base
和n
都是整数,但你想要整数结果,你可能需要将结果转换为整数类型,并考虑四舍五入或截断。
(3)使用库函数(针对大整数)
对于非常大的整数,标准C库可能不够用。在这种情况下,你可能需要使用专门的大数库,如GMP(GNU Multiple Precision Arithmetic Library)。这些库提供了用于处理大整数的函数,包括幂运算。
总结
对于大多数应用,如果你需要处理的是整数幂且数值不是特别大,使用循环(特别是快速幂算法)是一个很好的选择。如果你需要处理浮点数或者需要更复杂的数学运算,使用<math.h>
库中的pow
函数可能更方便。对于非常大的整数,考虑使用专门的大数库。