【重生之学习C语言----水仙花篇】
目录
编辑
----------------------------------------begin--------------------------------------
一、什么是水仙花数?
二、问题分析
确定数字的位数:计算输入数字的位数 n。
分离每一位数字:例如将 153 分离为 1、5、3。
计算各位的n次方和:将每一位的 n 次方相加。
判断是否相等:比较和与原数是否相等。
三、算法设计
计算位数:
分离每一位:
计算次方和:
判断逻辑:
四、代码实现
完整代码:
代码解析:
五、运行结果
六、关键问题与优化
为什么从100开始遍历?
如何处理更大的数字?
手动实现幂运算(避免依赖 math.h):
七、总结
路过的佬们点点关注哦~
你们的鼓励是我前进的动力~
----------------------------------------------end------------------------------------------
----------------------------------------begin--------------------------------------
一、什么是水仙花数?
水仙花数(Narcissistic Number),又称阿姆斯特朗数,是指一个 n
位数的正整数,其各位数字的 n
次方之和等于它本身。例如:
-
153 是3位水仙花数:13+53+33=15313+53+33=153
-
9474 是4位水仙花数:94+44+74+44=947494+44+74+44=9474
二、问题分析
要实现水仙花数的判断,需要解决以下问题:
-
确定数字的位数:计算输入数字的位数
n
。 -
分离每一位数字:例如将
153
分离为1
、5
、3
。 -
计算各位的n次方和:将每一位的
n
次方相加。 -
判断是否相等:比较和与原数是否相等。
三、算法设计
-
计算位数:
-
通过循环除以10统计次数,直到数字变为0。
-
-
分离每一位:
-
使用取模(
% 10
)获取最后一位,再通过整除(/ 10
)移除该位。
-
-
计算次方和:
-
调用
math.h
中的pow
函数,或手动实现幂运算。
-
-
判断逻辑:
-
如果次方和等于原数,则为水仙花数。
-
四、代码实现
-
完整代码:
#include <stdio.h>
#include <math.h>
int isNarcissistic(int number) {
int original = number;
int sum = 0;
int digits = 0;
int temp = number;
// 计算位数
while (temp != 0) {
temp /= 10;
digits++;
}
// 恢复原始值
temp = original;
// 计算各位的次方和
while (temp != 0) {
int remainder = temp % 10;
sum += pow(remainder, digits);
temp /= 10;
}
// 判断是否相等
return (sum == original);
}
int main() {
int lower = 100; // 水仙花数至少是三位数
int upper = 9999; // 示例范围扩大到四位数
printf("水仙花数(%d - %d):\n", lower, upper);
for (int i = lower; i <= upper; i++) {
if (isNarcissistic(i)) {
printf("%d\n", i);
}
}
return 0;
}
-
代码解析:
-
isNarcissistic
函数:-
计算位数:通过
while
循环统计除以10的次数。 -
分离各位数字:通过
% 10
取余和/ 10
整除操作。 -
次方和计算:使用
pow(remainder, digits)
计算每位数字的n
次方。
-
-
main
函数:-
遍历指定范围(如100-9999)内的所有数字。
-
调用
isNarcissistic
判断是否为水仙花数并输出。
-
五、运行结果
水仙花数(100 - 9999):
153
370
371
407
1634
8208
9474
六、关键问题与优化
-
为什么从100开始遍历?
-
水仙花数至少是三位数(如153),两位数无法满足条件。
-
-
如何处理更大的数字?
-
调整
upper
的值即可,但需注意数据溢出问题(int
类型上限约为 231−1231−1)。
-
-
手动实现幂运算(避免依赖
math.h
):
int power(int base, int exponent) {
int result = 1;
for (int i = 0; i < exponent; i++) {
result *= base;
}
return result;
}
七、总结
通过本博客,你学会了:
-
水仙花数的定义与数学原理。
-
分步骤算法设计:计算位数、分离数字、次方求和。
-
C语言实现技巧:循环、条件判断、函数封装。
-
扩展思路:如何优化代码、处理更大范围的数字。
动手挑战:尝试修改代码,找出所有5位水仙花数(如54748),并在评论区分享你的结果!