【C语言刷题系列】水仙花数的打印及进阶

1.水仙花数问题

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number)

水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。

使用C语言编程实现水仙花数的打印

首先水仙花数的范围是三位数,创建一个循环,范围是100到999

在循环内对每一个数进行判断------

  • 通过取模和整除的方式将三位数的每一位都剥离出来
  • 再将每一位的3次方 相加求和,与原来的三位数本身进行比较
  • 如果相等,打印该数
cpp 复制代码
#include<stdio.h>
int main()
{
    for (int i = 100; i <= 999; i++)
    {
        int a = i % 10;
        int b = i / 10 % 10;
        int c = i / 100; //分别求出整数的每一位
        int sum = a * a * a + b * b * b + c * c * c;
        if (sum==i)
            printf("%d ", i);
    }
    printf("\n");
    return 0;
}

2.水仙花数问题的拓展(任意范围内整数)

对水仙花数的范围进行拓展,求出各位数字的n次方之和确好等于该数本身的数

解决思路

依然是创建一个for循环,这次的范围是10-100000(因为10以内的数对于水仙花数的要求是恒成立的,所以不在考虑范围内)

进入循环之后,因为这次不知道当下要判断的是几位数,也就不知道每一位应该计算几次方,所以要先计算出数字的位数

cpp 复制代码
int count = 0;
int temp = i;//使用临时变量拷贝数字,防止原数字被破坏
while (temp)
{
    temp = temp / 10;//每次整除10,消除一位,直到原数字为0
    count++;
}

接下来,就是计算每一位次方的和,这次要借助于pow库函数,所以记得添加<math.h>头文件

------pow函数用于求一个数的n次方,函数原型如下

复制代码
double pow (double base, double exponent);

关于pow函数详细说明参考pow - C++ 参考 (cplusplus.com)

cpp 复制代码
 temp = i;//对临时变量重新赋初值(不能忘记)
 int sum = 0;
 while (temp)
 {
     sum += pow(temp % 10, count);//每次求得当前最后一位数的count次方,累加到sum中
     temp /= 10;//求得该位之后,去除该位
 }

最后,得到的值存储在sum中,再来一个if语句判断

完整代码

cpp 复制代码
#include<stdio.h>
#include<math.h>
int main()
{
    for (int i = 10; i <= 100000; i++)
    {
        int count = 0;     //位数计算部分
        int temp = i;
        while (temp)
        {
            temp = temp / 10;
            count++;
        }

        temp = i;         //水仙花数条件判断部分
        int sum = 0;
        while (temp)
        {
            sum += pow(temp % 10, count);
            temp /= 10;
        }
        if (sum == i)
            printf("%d ", i);
    }
    return 0;
}

当然,为了封装和代码复用的考虑,可以将判断的代码放在函数内

优化后代码

cpp 复制代码
#include<stdio.h>
#include<math.h> //pow

int get(int n)//计算位数
{
    int count = 0;
    while (n)
    {
        n /= 10;
        count++;
    }
    return count;
}

int judge(int n)//判断函数
{
    int temp = n;
    int sum = 0;
    while (temp)
    {
        sum += pow(temp % 10, get(n));
        temp /= 10;
    }
    if (sum == n)
        return 1;
    else
        return 0;
}

int main()
{
    for (int i = 10; i <= 100000; i++)
    {
        if (judge(i))
            printf("%d ", i);
    }
    printf("\n");
    return 0;
}
相关推荐
007php0073 分钟前
百度面试题解析:synchronized、volatile、JMM内存模型、JVM运行时区域及堆和方法区(三)
java·开发语言·jvm·缓存·面试·golang·php
芒果量化21 分钟前
Optuna - 自动调参利器&python实例
开发语言·python·算法·机器学习
foundbug99940 分钟前
基于CSMA-CA协议的V2X通信MATLAB仿真
开发语言·网络·matlab
cellurw41 分钟前
Day67 Linux I²C 总线与设备驱动架构、开发流程与调试
linux·c语言·架构
WangMing_X1 小时前
C#上位机软件:2.5 体验CLR实现多语言混合编程
java·开发语言·c#
jerryinwuhan1 小时前
pybullet入门到入门_1
开发语言·人工智能·python
豐儀麟阁贵1 小时前
4.4数组的基本操作
java·开发语言·数据结构·算法
Moniane1 小时前
XMW技术:颠覆未来的创新引擎
开发语言
组合缺一1 小时前
全球首个支持 IETF JSONPath (RFC 9535) 标准的 Java 框架,Snack4-Jsonpath v4.0.0 发布
java·开发语言·json·jsonpath
无限进步_1 小时前
【C语言】在矩阵中高效查找数字的算法解析
c语言·开发语言·数据结构·c++·其他·算法·矩阵