A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 候长亮 中级黑马   /  2015-5-26 23:21  /  1501 人查看  /  26 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

犹豫了好久,还是发了这个帖子,我是新手,这是我做完之后感觉最有成就感的程序。所以就算被定义为水贴,我也要发出来。
课堂老师讲了水仙花数,我就立马考虑到是不是要做到用户输入一个范围就可以算出水仙花这一类的数字。
所以就自己写了超级水仙花数,其实名字都是自己瞎起的,百度了才知道网上有具体的名字。
但是我还是按照自己的思路来,以下代码如有不足或者可以简化的地方,请大家多多指导。
打印出所有的"水仙花数"。
所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
提示:
1:采用循环取得所有的三位数。(三位数指的是100-999之间的数)。
2:把每个三位数的个位,十位,百位进行分解。
思路:
1、水仙花数是三位数,所以循环的范围是100~1000之间的所有整数
2、知道固定的范围所以使用for循环。
3、水仙花数要获取三位数的每个位置上的数,这个时候可以用取模取出个位数
  然后除10获取下一个个位数,依次就获取每个数字了。
4、循环体是要每次判断遍历到的数字是否符合水仙花数的格式,所以需要用if来判断。
5、每次遍历到符合条件的数都要输出,所以输出语句要写到循环内。
6、可能用到的变量sum是临时变量记录立方和,每次循环都要重新赋值给sum。
超级水仙花数,就是在水仙花数的基础上扩展的:
概念是:这个数字是n位数,每个位上的n次方的和就等于原数。
  1. //导入Scanner工具包,用于接收键盘录入
  2. import java.util.Scanner;
  3. class SuperShuiXianHua
  4. {
  5. public static void main (String[] args)
  6. {
  7.   //委婉的提示用户输入的范围。
  8.   System.out.print("请输入水仙花的花瓣数(不要大于1亿):");
  9.   Scanner sc =new Scanner(System.in);
  10.   int HuaBan =sc.nextInt();
  11.   if (HuaBan>1000000)
  12.   {
  13.    System.out.println("花瓣太多了,让我慢慢数数");
  14.   }
  15.   if (HuaBan<153)
  16.   {
  17.    System.out.println("花瓣太少了,不够水仙花!!");
  18.   }
  19.   //遍历用户定义范围内的所有整数
  20.   for (int x=0;x<HuaBan; x++)
  21.   {
  22.    //用于接收n位数x的每个位上的数的n次方和
  23.    int y =getSum(x);
  24.    //如果这个和等于原数就输出
  25.    if(y==x)
  26.     System.out.print(x+",");
  27.   }
  28. }
  29. //封装一个返回值为int类型的方法来获取n位数上每个位上数字的n次方的和
  30. public static int getSum(int num)
  31. {
  32.   //定义n来记录数字是n位数
  33.   int n=0;
  34.   //定义一个临时变量记录数字的变化
  35.   int a=num;
  36.   //定义一个sum记录每个位上的n次方的和
  37.   int sum=0;
  38.   //判断这个数字的位数,用变量n接收
  39.   while (a!=0)
  40.   {
  41.    //通过每次除10的方法,每除一次n就自增一次,直到这个数为0,就可以判断出这是个n位数。
  42.    a=a/10;
  43.    n++;
  44.   }
  45.   //通过循环计算每个位上数的n次方和
  46.   for (int x=0;x<n ;x++ )
  47.   {
  48.    //定义变量接收每个位上的n次方
  49.    int sco = 1;
  50.    //每循环一次,就从右往左获取数上的个位数
  51.    int b=num%10;
  52.    //获取个位数之后,就去掉已经获取的位置,下次循环原来的十位数就变为个位数
  53.    num=num/10;
  54.    //通过循环获取一个数的n次方
  55.    for (int y=0;y<n ; y++)
  56.    {
  57.     sco=sco*b;
  58.    }
  59.    //用sum接收原数每个位置上数的n次方的累积和
  60.    sum+=sco;   
  61.   }
  62.   //返回一个int类型的值,就是要的n次方的累积和
  63.   return sum;
  64. }

  65. }
  66. <p> </p>
复制代码

评分

参与人数 1黑马币 +1 收起 理由
王明月 + 1 很给力!

查看全部评分

26 个回复

倒序浏览
虽然看不懂,但我还是要顶!
回复 使用道具 举报
顶一下~~~~~
回复 使用道具 举报
顶一个!!!
回复 使用道具 举报
一块学习了。
回复 使用道具 举报
还是来晚了,没抢着沙发
回复 使用道具 举报
突然想到一句话,努力学习,其他的一切都不重要,唉 鼓励鼓励我自己
回复 使用道具 举报
kontar 发表于 2015-5-27 00:01
虽然看不懂,但我还是要顶!

怎么看不懂?我带了注释了额。。
回复 使用道具 举报
王明月 发表于 2015-5-27 00:10
突然想到一句话,努力学习,其他的一切都不重要,唉 鼓励鼓励我自己

其实我觉得你一个人再努力效果也是微乎其微的,只有大家一起努力,那种学习的气氛带动下的你,才会进步的更快。我和我的同桌好多问题都一起研究,那种学习的动力和吸引力,真是让人不断进步。希望你也是。
回复 使用道具 举报
路人乙1989 发表于 2015-5-27 00:07
还是来晚了,没抢着沙发

额。沙发坐着舒服吗?同是89的同志
回复 使用道具 举报

谢谢了。你怎么都20了,好厉害啊。我才8
回复 使用道具 举报
候长亮 发表于 2015-5-27 00:31
额。沙发坐着舒服吗?同是89的同志

还可以,这明天咱俩得聊聊人生,谈谈理想
回复 使用道具 举报
songyu 来自手机 中级黑马 2015-5-27 02:21:34
13#
水仙花吗,很简单的,for循环搞定就OK了
回复 使用道具 举报
lizhi 来自手机 中级黑马 2015-5-27 06:58:54
14#
候长亮 发表于 2015-5-26 23:21
犹豫了好久,还是发了这个帖子,我是新手,这是我做完之后感觉最有成就感的程序。所以就算被定义为水贴,我 ...

非常好!
回复 使用道具 举报
候长亮 发表于 2015-5-27 00:14
怎么看不懂?我带了注释了额。。

太长了没仔细看:lol
回复 使用道具 举报
顶一个!!
回复 使用道具 举报
顶一个!!!
回复 使用道具 举报
Lucus 中级黑马 2015-5-27 23:05:31
18#
路人乙1989 发表于 2015-5-27 00:33
还可以,这明天咱俩得聊聊人生,谈谈理想

好基友,一辈子!!!
回复 使用道具 举报
顶一个~
回复 使用道具 举报
努力加油努力加油~
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马