0

0

c++中如何判断一个数是否为水仙花数_c++三位数水仙花数代码

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-06 10:39:09

|

742人浏览过

|

来源于php中文网

原创

水仙花数是各位数字的n次方和等于自身的n位正整数。例如153是三位水仙花数,因1³+5³+3³=153;判断时需动态计算位数、逐位提取、手写整数幂函数防浮点误差,并注意整型溢出。

c++中如何判断一个数是否为水仙花数_c++三位数水仙花数代码

什么是水仙花数(Narcissistic Number)?

水仙花数特指一个 n 位正整数,其各位数字的 n 次方之和恰好等于它本身。比如三位数中常见的 153:因为 1³ + 5³ + 3³ = 1 + 125 + 27 = 153,所以它是水仙花数。

注意:严格来说,“水仙花数”在中文语境里常被默认为三位数,但数学定义是泛指 n 位数的自幂数。C++ 判断时必须先确定位数,再逐位求幂累加,不能硬编码只算三次方。

判断任意正整数是否为水仙花数的通用函数

关键点在于:不能假设输入一定是三位数;要动态计算位数、提取每位数字、用 pow 或手动幂运算(注意 pow 返回 double,可能有精度问题)。

  • 用循环或 to_string 获取位数 n
  • 用取模 % 10 和整除 / 10 提取每一位
  • 避免 pow(digit, n) —— 对大数或某些编译器(如 MSVC)可能导致浮点误差,建议手写整数幂函数
  • 注意 int 溢出风险:比如 9⁹ = 387,420,489,仍在 int 范围内;但 9¹⁰ 就超了,所以对超过 9 位的数,可提前返回 false 或改用 long long
bool isNarcissistic(int num) {
    if (num <= 0) return false;
    int temp = num;
    int n = 0;
    while (temp) { n++; temp /= 10; } // 计算位数

    temp = num;
    int sum = 0;
    while (temp) {
        int digit = temp % 10;
        int power = 1;
        for (int i = 0; i < n; ++i) power *= digit; // 手动计算 digit^n
        sum += power;
        temp /= 10;
    }
    return sum == num;
}

输出所有三位数水仙花数的简洁代码

如果只要三位数(100–999),可直接固定 n = 3,省去位数统计开销,也更安全——因为三位数的立方最大为 9³ = 729,三个相加最多 3×729 = 2187,不会溢出 int

立即学习C++免费学习笔记(深入)”;

速创猫AI简历
速创猫AI简历

一键生成高质量简历

下载

常见错误:用 pow(i/100, 3) + pow((i/10)%10, 3) + pow(i%10, 3) —— pow 的浮点结果转 int 可能因舍入误差错判(例如 pow(4,3) 理论是 64,但某些平台返回 63.999999)。

#include 
using namespace std;

int main() {
    cout << "三位水仙花数:";
    for (int i = 100; i <= 999; ++i) {
        int a = i / 100;
        int b = (i / 10) % 10;
        int c = i % 10;
        int sum = a*a*a + b*b*b + c*c*c;
        if (sum == i) cout << i << " ";
    }
    cout << endl;
    return 0;
}

容易被忽略的边界与性能细节

真正写健壮代码时,这几个点常被跳过:

  • 0 不是水仙花数(按定义要求“正整数”,且 0¹ = 0 会误判;但单独处理更清晰)
  • 一位数如 5:满足 5¹ = 5,数学上属于水仙花数,但多数题目隐含“多位数”,需看题意
  • std::to_string(x).length() 简洁但有构造开销,对高频调用不友好
  • 预计算幂表(如 int cube[10] = {0,1,8,27,...})比每次循环乘更快,尤其对固定位数场景

如果你在写算法题或嵌入式环境,优先手算幂、避免 pow、显式处理 0 和负数——这些不是“小问题”,而是导致 WA 或运行时异常的根源。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

528

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

97

2025.10.23

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

912

2023.09.19

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

394

2023.08.14

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.5万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号