一道java算法题分析
最近在面试中遇到这样的一道算法题:
求100!的结果的各位数之和为多少?
如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3
这道题不算难,不过倒是注意的细节也有一些:
1.数据的越界问题
如果求的是171的阶乘的话,就会超出double类型的存储范围,这时候就要处理了,不然得到的结果是:Infinity
1.可以通过java的BigInteger类来进行处理;
2.可以将结果中的每一位数存在一个int类型的数组中,不过这个方法还没有想出来
代码如下:
1 package com.fire.test; 2 3 public class Test { 4 5 public static void main(String args[]) { 6 7 double res = getFactorial(100); 8 int sum = getSum(res); 9 System.out.println(sum); 10 } 11 12 /** 13 * 求一个数的阶乘(递归) 14 * @param num 15 * 当num为171时会超出double类型的存储范围 16 */ 17 private static double getFactorial(int num) { 18 19 double res = 0; 20 if (num == 1) { 21 22 return 1; 23 } else { 24 25 res = num * getFactorial(num - 1); 26 } 27 return res; 28 } 29 /** 30 * 求出每位数的和 31 * @param res 32 * @return 33 */ 34 private static int getSum(double res) { 35 36 int sum = 0; 37 while (res > 0) { 38 39 sum += res % 10; 40 res /= 10; 41 } 42 return sum; 43 } 44 /** 45 * 通过字符串截取的方式获得各位数的和(通过截取字符串的方式来求) 46 * @param res 47 * @return 48 * http://www.cnblogs.com/sosoft/ 49 */ 50 private static int getSum1(double res) { 51 52 int sum = 0; 53 String resStr = String.valueOf(res); 54 for (int i = 0; i < resStr.length(); i++) { 55 56 // 一个char类型的数据减去'0'可以得到对应的int类型 57 sum += resStr.charAt(i) - '0'; 58 } 59 return sum; 60 } 61 }