首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言刷题系列】水仙花数的打印及进阶

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

作者头像
倔强的石头_
发布2024-12-06 18:42:13
发布2024-12-06 18:42:13
4520
举报
文章被收录于专栏:C/C++指南C/C++指南

1.水仙花数问题

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number) 水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。 使用C语言编程实现水仙花数的打印

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

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

  • 通过取模和整除的方式将三位数的每一位都剥离出来
  • 再将每一位的3次方 相加求和,与原来的三位数本身进行比较
  • 如果相等,打印该数
代码语言:javascript
复制
#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以内的数对于水仙花数的要求是恒成立的,所以不在考虑范围内)

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

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

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

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

代码语言:javascript
复制
double pow (double base, double exponent);

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

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

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

完整代码
代码语言:javascript
复制
#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;
}

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

优化后代码
代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.水仙花数问题
  • 2.水仙花数问题的拓展(任意范围内整数)
    • 解决思路
    • 完整代码
    • 优化后代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档