【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;
}
相关推荐
catchadmin1 小时前
使用 PHP 和 WebSocket 构建实时聊天应用 完整指南
开发语言·websocket·php
我命由我123452 小时前
Java 开发问题:包名 ‘com.my.compressimagetest‘ 与同名的类发生冲突
java·开发语言·学习·java-ee·intellij-idea·学习方法·intellij idea
APIshop2 小时前
用第三方爬虫调用「淘宝评论 API」全流程实战
开发语言·爬虫
⑩-2 小时前
Sleep与Wait的区别
java·开发语言
程序员阿鹏2 小时前
List和Set的区别
java·开发语言·数据结构·后端·list
郑州光合科技余经理2 小时前
技术解析:如何打造适应多国市场的海外跑腿平台
java·开发语言·javascript·mysql·spring cloud·uni-app·php
全栈陈序员2 小时前
【Python】基础语法入门(二十四)——文件与目录操作进阶:安全、高效地处理本地数据
开发语言·人工智能·python·学习
是有头发的程序猿2 小时前
Python爬虫实战:面向对象编程构建高可维护的1688商品数据采集系统
开发语言·爬虫·python
lkbhua莱克瓦242 小时前
多线程综合练习3
java·开发语言·多线程·githup
郝学胜-神的一滴2 小时前
封装OpenGL的Shader相关类:从理论到实践
开发语言·c++·程序人生·游戏·图形渲染