【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;
}
相关推荐
Wenweno0o19 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
chenjingming66619 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
qq_3395548219 小时前
英飞凌ModusToolbox环境搭建
c语言·eclipse
cch891820 小时前
Python主流框架全解析
开发语言·python
不爱吃炸鸡柳20 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发20 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
Momentary_SixthSense20 小时前
设计模式之工厂模式
java·开发语言·设计模式
‎ദ്ദിᵔ.˛.ᵔ₎20 小时前
STL 栈 队列
开发语言·c++
勿忘,瞬间20 小时前
数据结构—顺序表
java·开发语言
张張40820 小时前
(域格)环境搭建和编译
c语言·开发语言·python·ai