• 每日一题——“水仙花数”


     哈喽大家好,我是保护小周ღ,本期为大家带来的是求“水仙花数”,此水仙花,非彼水仙花,一起来看看把~

     

    题目:

    求出0~100000之间的所有“水仙花数”并输出。

    描述:

    “水仙花数”是指一个n位数,其各位数字的n次方之和刚好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

    注意范围是0~100000之间的所有符合描述的“水仙花数”。

    思路解析:

    根据描述,我们知道,各位数字的n次方之和刚好等于该数本身才能称之为“水仙花数”,先尝试判断一个数是否为水仙花数,怎么判断呢?

    第一步:求出该数的位数n。

    第二步:求出该数每一位的n次方之和。

    第三步:判断该数字的n次方之和是否刚好等于该数本身

    本次博主给大家带来两种解题方式,思路都是一样的,普通计数,递归计数。

    普通计数:

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include<stdio.h>
    3. //统计每一个数的位数
    4. int Count(int size)
    5. {
    6. int n = 0;
    7. while (size)
    8. {
    9. size = size / 10;
    10. ++n;
    11. }
    12. return n;
    13. }
    14. //判断是否为水仙花
    15. int IfDaffodil(int i,int n)
    16. {
    17. int size = i;
    18. int sum = 0;
    19. //判断是否为符合“水仙花”
    20. while (size!=0)
    21. {
    22. int ssum = 1;
    23. //ssum统计每一位的n次方
    24. for (int j = 0; j < n; j++)
    25. {
    26. ssum *= size % 10;
    27. }
    28. size = size / 10;
    29. //sum统计各位的n次方之和
    30. sum += ssum;
    31. }
    32. //各位数字的n次方之和确好等于该数本身
    33. if (sum == i)
    34. {
    35. return 1;
    36. }
    37. else
    38. {
    39. return 0;
    40. }
    41. }
    42. int main()
    43. {
    44. //遍历区间
    45. for (int i = 0; i <= 100000; ++i)
    46. {
    47. //当程序执行IfDaffodil时,会先执行完作为“参数”的Count,等Count执行完毕再执行自己
    48. int size=IfDaffodil(i, Count(i));
    49. if (size == 1)
    50. {
    51. printf("%d ",i);
    52. }
    53. else
    54. {
    55. continue;
    56. }
    57. }
    58. return 0;
    59. }

     递归计数:

    1. #include<stdio.h>
    2. //统计每一个数的位数
    3. int Count(int n)
    4. {
    5. if (n < 10)//当该数只剩个位时,递归结束
    6. return 1;
    7. else
    8. return Count(n / 10) + 1;
    9. /*
    10. {
    11. n=n/10;
    12. return Count(n)+1;
    13. }
    14. */
    15. }
    16. //计算每一位的n次方
    17. int Pow(int x, int n)
    18. {
    19. if (n == 0)
    20. return 1;
    21. else
    22. return pow(x, --n) * x;//x^n
    23. }
    24. int main()
    25. {
    26. //遍历区间
    27. for (int i = 0; i < 100000; ++i)
    28. {
    29. int n = i;
    30. int sum = 0;
    31. //判断是否为符合“水仙花”
    32. while (n)
    33. {
    34. //n % 10 拿到最后一位,然后根据本身的位数求次方
    35. sum += (Pow((n % 10), Count(i)));//Pow计算每一位的n次方
    36. n /= 10;
    37. }
    38. if (sum == i)
    39. {
    40. printf("%d ", sum);
    41. }
    42. else
    43. {
    44. continue;
    45. }
    46. }
    47. return 0;
    48. }

    感兴趣的朋友可以用博主的方法,或者是自己的方法做做这道题。

    分享一个牛客网上类似的题目,大家也可以尝试着做一做。

    链接:水仙花数_牛客题霸_牛客网

    感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ  *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

      如有侵权请联系修改删除!

  • 相关阅读:
    【全国大学生统计建模】首次参与获得国家三等奖的经历
    深度解读DBSCAN聚类算法:技术与实战全解析
    UWA Pipeline 2.2.1 版本更新说明
    现在市面跑步耳机哪款好用、分享五款适合跑步用的耳机推荐
    阿里Java二面:从底层聊下IO多路复用模型?这不有嘴就会
    Thinkpad T14升级Windows11ver22h2失败问题解决小记
    CF1012C Hills
    TPS2H160BQPWPRQ1 集成160mΩ的双通道智能高侧开关
    java之Servlet
    List——顺序表与链表(二)
  • 原文地址:https://blog.csdn.net/weixin_67603503/article/details/125555313