计算任意位数的水仙花数

水仙花数问题:

某个三位数的各个位的三次方加起来的和,如果等于这个数本身,那么这个数就是水仙花数。

这个题作为编程新手必做的练习题,我就不多说了。不过不满足于程序的死板,于是想找找任意位数的数字的水仙花数,talk is cheap,show you the code !(语言选择Java,计算了10亿以内的水仙花数)

 

public class ShuiXianHuaDemo {

	public static void main(String[] args) {
		// 普通问题,求100-999的水仙花数
		method1();

		System.out.println("----------------");

		// 进阶问题:求1000到9999的水仙花数
		method2();

		System.out.println("----------------");

		// 终极问题:求任意位数的所有水仙花数
		for (int i = 1; i < 1000000000; i++) {
			// 调用qiuhe(i)方法,计算数字i的各个数位的n次方和,n为这个数的位数
			if (i == qiuhe(i)) {
				System.out.println(i);
			}
		}

	}

	// 求和方法

	private static int qiuhe(int i) {
		int sum = 0;// sum变量用于存放最后要返回的次方和
		int bit = 0;// bit变量用于保存这个数字是多少位
		int temp;// temp变量用于临时存放这个数字的某一位的bit次和

		// 先一个循环计算多少数字有多少位,将用确定乘数个数
		for (int j = i; j != 0; j = j / 10) {
			bit++;
		}

		// 外层for循环:每次执行每一位上的次方和
		for (int j = i; j > 0; j = j / 10) {
			int shu = j % 10;// shu变量用于临时存放某一位上的数字是多少
			temp = shu;// 将shu赋值给temp,用于临时计算每次
			// 用循环的方式计算n-2次,shu位上的乘积之和,循环bit-1次即可求出bit个shu的乘积
			for (int n = 1; n < bit; n++) {
				temp = temp * shu;
			}
			// 将计算出的temp交给sum,作为一位的结果,然后继续做下一位,直到所有位数的次方和全部累加到sum
			sum = sum + temp;
		}

		// 将最后结果返回
		return sum;
	}

	private static void method2() {
		for (int i = 1000; i < 10000; i++) {
			int j = i;
			int g = j % 10;// g代表个位
			j = j / 10;
			int s = j % 10;// s代表十位
			j = j / 10;
			int b = j % 10;// b代表百位
			j = j / 10;

			int he = g * g * g * g + s * s * s * s + j * j * j * j + b * b * b * b;

			if (i == he) {
				System.out.println(i);
			}
		}
	}

	private static void method1() {
		for (int j = 100; j <= 999; j++) {
			int i = j;
			int g = i % 10;
			i = i / 10;
			int s = i % 10;
			int b = i / 10;
			if ((g * g * g + s * s * s + b * b * b) == j) {
				System.out.println(j);
			}
		}
	}

}

最终运行结果: 

153
370
371
407
----------------
1634
8208
9474
----------------
1
2
3
4
5
6
7
8
9
153
370
371
407
1634
8208
9474
54748
92727
93084
548834
1741725
4210818
9800817
9926315
24678050
24678051
88593477
146511208
472335975
534494836
912985153

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值