【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;
}
相关推荐
q5673152311 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
许野平36 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨39 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
朱一头zcy1 小时前
C语言复习第9章 字符串/字符/内存函数
c语言
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵2 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong2 小时前
Java反射
java·开发语言·反射