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