C语言学习笔记20260611-水仙花数(2种解法)

C语言学习笔记20260611-水仙花数(2种解法)

一、题目要求

求出 0 ~ 100000 之间所有的水仙花数并输出。

水仙花数定义

一个 n 位数 ,其各位数字的 n 次方和 等于自身。

示例:153 = 1³ + 5³ + 3³


二、解法一:标准库函数 pow版

1. 思路

  • 遍历 0~100000 所有数字

  • 先计算当前数字的总位数 n

  • 逐位拆解数字,累加每一位的 n 次方

  • 判断:次方和是否等于原数,相等即为水仙花数

2. 完整可运行代码

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

// 功能:输出0~100000之间所有水仙花数
int main()
{
    // 遍历区间所有数字
    for (int i = 0; i <= 100000; i++)
    {
        // 临时变量,保存当前数字,避免修改原数i
        int temp = i;
        int len = 0;  

        // 1、计算当前数字的位数
        while (temp != 0)
        {
            len++;
            temp /= 10;
        }

        // 重置临时变量,重新拆解数字
        temp = i;
        int sum = 0; 

        // 2、计算各位数字的len次方之和
        while (temp != 0)
        {
            int bit = temp % 10;        // 取出末尾一位数字
            sum += pow(bit, len);       // 累加:当前位^位数
            temp /= 10;                 // 去掉末尾一位
        }

        // 3、判断是否为水仙花数
        if (sum == i)
        {
            printf("%d ", i);
        }
    }

    return 0;
}

3. 优缺点

优点:代码简短、逻辑通用、新手易写

缺点:pow是浮点函数,极少数情况存在精度误差


三、解法二:自定义幂函数版(零精度误差)

1. 思路

手动实现整数次方函数,完全舍弃pow,全程整数运算,无精度丢失,考试最稳!

2. 完整可运行代码

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 自定义整数幂函数:计算 base^exp(整数运算,无精度误差)
int my_pow(int base, int exp)
{
    int res = 1;
    for (int i = 0; i < exp; i++)
    {
        res *= base;
    }
    return res;
}

int main()
{
    // 遍历0~100000所有数字
    for (int i = 0; i <= 100000; i++)
    {
        int temp = i;
        int len = 0;

        // 1. 获取数字位数
        while (temp != 0)
        {
            len++;
            temp /= 10;
        }

        // 2. 计算各位n次方和
        temp = i;
        int sum = 0;
        while (temp != 0)
        {
            int bit = temp % 10;
            sum += my_pow(bit, len); // 调用自定义幂函数
            temp /= 10;
        }

        // 3. 判断水仙花数
        if (sum == i)
        {
            printf("%d ", i);
        }
    }

    return 0;
}

3. 优缺点

优点:纯整数运算、零精度错误、考试竞赛首选

缺点:多定义一个函数,代码稍长


四、输出结果

Plain 复制代码
1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 54748 92727 93084

五、总结

  • 所有临时变量(位数、累加和)必须在循环内重置

  • 求位数标准写法:while(temp != 0)

  • 整数次方优先手写函数,避免pow浮点精度丢分

  • 水仙花数判断顺序:求位数 → 求次方和 → 对比判断

相关推荐
luj_176830 分钟前
毒素驱动的生物自毁机制探析
服务器·c语言·开发语言·经验分享·算法
冬夜戏雪1 小时前
学习日记-LRU缓存成员变量,入参day1
学习
深念Y1 小时前
Windows 11 工具链部署与 SSH 踩坑笔记
windows·笔记·ssh
Sunshing151 小时前
非自治连续系统稳定性定义与定理判据
笔记·学习
苏灵凯1 小时前
Codex 官网前端可以抄吗?从设计到实现的技术拆解
笔记·ai·agent·codex·deepseek
andrsted2 小时前
老师可以用小程序在线整理题库、课堂检测和错题集
学习·微信小程序·小程序·学习方法
zhangrelay3 小时前
手机-笔电-等数码产品-电池健康的一些数据-2026
笔记·学习·锂电池
苏子寒4 小时前
Nano-VLLM全代码解析笔记(10)-GemmaRMSNorm和MRoPE
笔记·机器学习·ai·nlp·vllm
y = xⁿ1 天前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
HugoStudio_SWAN2 天前
【擦除重绘】C++ 控制台动画:弹跳 Logo DVD 屏保效果
开发语言·c++·学习·程序人生