柔城

SOSOFT articles

一道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 }

 

posted on 2014-01-03 16:47  柔城  阅读(639)  评论(0编辑  收藏  举报

导航