【手把手带你刷LeetCode】——19.水仙花数(作业)

举报
安然无虞 发表于 2022/05/26 23:56:24 2022/05/26
【摘要】 【前言】 今天是力扣打卡第19天! 太忙了,发的有点晚,抱歉哈,最近笔者作业有点多,也有几题比较好的,所以就整理出来了。 题目:求水仙花数 题目描述: 求出0~100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身,如 : 153=1 ^ 3+5 ^...

【前言】

今天是力扣打卡第19天!

太忙了,发的有点晚,抱歉哈,最近笔者作业有点多,也有几题比较好的,所以就整理出来了。

题目:求水仙花数

题目描述:

求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身,如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。

注意哦,正常我们求水仙花数算的是三位数,但是这题不是哦,本题要算到十万。

题解:

题目讲的是一个n位数,其各位数字的n次方之和正好等于该数本身,所以我们需要知道要求数的位数,并且这个数的每一位数字上的n次方也需要计算。

首先,求一个数字有多少位


  
  1. //判断num的位数
  2. //正常代码
  3. int Dig(int num)
  4. {
  5. int count = 0;
  6. while (num)
  7. {
  8. count++;
  9. num = num / 10;
  10. }
  11. return count;
  12. }
  13. //递归解决
  14. //递归解决
  15. int Dig(int num)
  16. {
  17. int count = 0;
  18. //找边界
  19. if (num < 10)
  20. {
  21. return 1;
  22. }
  23. else
  24. {
  25. count = Dig(num / 10);
  26. return ++count;
  27. }
  28. }

其次,计算n的k次方 


  
  1. //求n的k次方
  2. //普通方法
  3. int Pow(int n, int k)
  4. {
  5. int ret = 1;
  6. //判断特殊情况
  7. if (n == 0)
  8. {
  9. return 0;
  10. }
  11. while (k)
  12. {
  13. ret = ret * n;
  14. k--;
  15. }
  16. return ret;
  17. }
  18. //递归解决
  19. int Pow(int n, int k)
  20. {
  21. //找边界
  22. if (k == 0)
  23. {
  24. return 1;
  25. }
  26. else
  27. {
  28. return n * Pow(n, k - 1);
  29. }
  30. }

最后,判断是否为水仙花数


  
  1. //判断是否为水仙花数
  2. int func(int num)
  3. {
  4. int sum = 0;
  5. int number = num;
  6. int n = Dig(num);
  7. int i = 0;
  8. for (i = 0; i < n; i++)
  9. {
  10. sum = sum + Pow(number % 10, n);
  11. number = number / 10;
  12. }
  13. if (sum == num)
  14. {
  15. return 1;
  16. }
  17. else
  18. {
  19. return 0;
  20. }
  21. }

完整代码:


  
  1. //求出0~100000之间的所有“水仙花数”并输出。
  2. //“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。
  3. #include<stdio.h>
  4. //求n的k次方
  5. //普通方法
  6. //int Pow(int n, int k)
  7. //{
  8. // int ret = 1;
  9. // //判断特殊情况
  10. // if (n == 0)
  11. // {
  12. // return 0;
  13. // }
  14. // while (k)
  15. // {
  16. // ret = ret * n;
  17. // k--;
  18. // }
  19. // return ret;
  20. //}
  21. // 递归解决:
  22. int Pow(int n, int k)
  23. {
  24. //找边界
  25. if (k == 0)
  26. {
  27. return 1;
  28. }
  29. else
  30. {
  31. return n * Pow(n, k - 1);
  32. }
  33. }
  34. 判断num的位数
  35. //int Dig(int num)
  36. //{
  37. // int count = 0;
  38. // while (num)
  39. // {
  40. // count++;
  41. // num = num / 10;
  42. // }
  43. // return count;
  44. //}
  45. //
  46. //递归解决
  47. int Dig(int num)
  48. {
  49. int count = 0;
  50. //找边界
  51. if (num < 10)
  52. {
  53. return 1;
  54. }
  55. else
  56. {
  57. count = Dig(num / 10);
  58. return ++count;
  59. }
  60. }
  61. //判断是否为水仙花数
  62. int func(int num)
  63. {
  64. int sum = 0;
  65. int number = num;
  66. int n = Dig(num);
  67. int i = 0;
  68. for (i = 0; i < n; i++)
  69. {
  70. sum = sum + Pow(number % 10, n);
  71. number = number / 10;
  72. }
  73. if (sum == num)
  74. {
  75. return 1;
  76. }
  77. else
  78. {
  79. return 0;
  80. }
  81. }
  82. int main()
  83. {
  84. int i = 0;
  85. for (i = 0; i <= 100000; i++)
  86. {
  87. if (1 == func(i))
  88. {
  89. printf("%d\n", i);
  90. }
  91. }
  92. return 0;
  93. }

总结

今天是力扣打卡第19天!

昨天太忙了,没来得及发,这篇是补昨天的,抱歉抱歉哈。

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121409554

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。