一个整型变量只能用来存贮较小的 N!的值,当 N 较大时,可将阶乘值中的每一个数字
放在一个一维数组的一个元素中。使用这方法,任选 Objective-C/C/C++/Java 之一打印:
① N!的值;
② N!-M!(M>N);
③ N!+M!

解决方案 »

  1.   

    我是用的bigInteger 但是没必要放到数组啊  没理解题目意思
      

  2.   

     如果不用BigInteger 应该怎么去解决?
    题目的意思是 比方说7!=5040  可以存在数组里表示 int[] a =new int[]{5,0,4,0}; 
    或者String a="5040";
    当N!所产生的值 在数据基本类型里放不下的时候 可以 用数组 存放 通过这种思想进行大数运算 
      

  3.   

    给LZ个sample吧import java.util.*;
    class Test {
        public static void main(String[] args) throws Exception {
            int[] result = calN(5);
            System.out.println(Arrays.toString(result).replaceAll("\\D+", ""));
        }    public static int[] calN(int n) {
            if (n < 0) return new int[]{-1};
            if (n < 2) return new int[]{1};
        
            int[] result = new int[]{1}; //这里可以先算N阶乘结果可能的最大长度
                                          //然后直接new一个和该长度相同长度的数组
                                          //在这里偷懒,所以每次自己加长数组长度,这样效率较差
                                          //但是只是为了说明算法
             for (int i=1; i<=n; i++) {
                for (int j=result.length-1; j>=0; j--) { //数组每位相乘
                    result[j] *= i;
                }
                for (int j=result.length-1; j>0; j--) { //数组进位
                    result[j-1] += (result[j]/10);
                    result[j] %= 10;  
                }
                if (result[0] > 9) { //最高位大于9,变长数组
                    int cnt = String.valueOf(result[0]).length()-1;
                    int[] tmp = new int[result.length+cnt];
                    System.arraycopy(result, 1, tmp, cnt+1, result.length-1);
                    while (result[0] > 10) {
                        tmp[cnt--] = result[0] % 10;
                        result[0] /= 10;
                    }
                    tmp[0] = result[0];
                    result = tmp;
                }
            }
            return result;
        }
    }这里只给了阶乘的例子,至于加减法,LZ从例子里自己体会吧,其实就是M每次取后一个数字出来和数组相应的位置的数进行加减
    M的每个数字如何取?
    int lastNumber = M%10; //取最后一个数字
    M /= 10; //然后M除以10
    把这个过程放到数组循环中就可以了,提示已经给到这里,基本上没什么难点了,LZ慢慢体会吧。
      

  4.   

    题目的意思应当是不用BigInteger,否则没什么好考了