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浮点精度丢分

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

相关推荐
小肝一下几秒前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月7 分钟前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基11 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
AOwhisky18 分钟前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
砚凝霜19 分钟前
软考网络工程师|第 2 章 信道延迟、传输介质、数据编码、数字调制、PCM 完整备考笔记
网络·笔记·pcm
woshihuanglaoshi33 分钟前
数据迁移与版本管理 - Flutter在鸿蒙平台实现数据库升级策略
数据库·学习·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
炸膛坦客9 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
世人万千丶10 小时前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
遇乐的果园13 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
遇乐的果园15 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习