一道java算法题分析

时间:2022-06-02 14:15:53

最近在面试中遇到这样的一道算法题:
       求100!的结果的各位数之和为多少?
       如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3
这道题不算难,不过倒是注意的细节也有一些:
1.数据的越界问题

如果求的是171的阶乘的话,就会超出double类型的存储范围,这时候就要处理了,不然得到的结果是:Infinity
1.可以通过java的BigInteger类来进行处理;
2.可以将结果中的每一位数存在一个int类型的数组中,不过这个方法还没有想出来

代码如下:

 package com.fire.test;

 public class Test {

     public static void main(String args[]) {

         double res =  getFactorial(100);
int sum = getSum(res);
System.out.println(sum);
} /**
* 求一个数的阶乘(递归)
* @param num
* 当num为171时会超出double类型的存储范围
*/
private static double getFactorial(int num) { double res = 0;
if (num == 1) { return 1;
} else { res = num * getFactorial(num - 1);
}
return res;
}
/**
* 求出每位数的和
* @param res
* @return
*/
private static int getSum(double res) { int sum = 0;
while (res > 0) { sum += res % 10;
res /= 10;
}
return sum;
}
/**
* 通过字符串截取的方式获得各位数的和(通过截取字符串的方式来求)
* @param res
* @return
* http://www.cnblogs.com/sosoft/
*/
private static int getSum1(double res) { int sum = 0;
String resStr = String.valueOf(res);
for (int i = 0; i < resStr.length(); i++) { // 一个char类型的数据减去'0'可以得到对应的int类型
sum += resStr.charAt(i) - '0';
}
return sum;
}
}