给定一个数N 求n=!a+!b+!c.....+!X
!2=1*2
!3=1*2*3
!4=1*2*3*4
...
 
打印出a b c......x

解决方案 »

  1.   

    public class Test {
    public static void main(String[] args) {
    for(int i=0;i<10;i++){
    System.out.println("!"+i+"="+fun(i));
    }
    }

    public static int fun(int n){
    if(n==0 || n==1){
    return 1;
    }else{
    return n*fun(n-1);
    }
    }
    }给个你参考一下(递归的思想)
      

  2.   

    也给个代码,效率会高些(认为应该是正确的,未测试过)
    public class Test {
        static long  result = 1;   //此处一定要定义成静态的
        public static void main(String[] args) {
            long result = 0;
            for(int i=1;i<=5;i++){
                result = result + fun(i);
            }
            System.out.println("1! + 2! + 3! + 4! + 5! = " + result);
        }
        
        public static long fun(int n){
            
            result = result * n;
            return result;
           }
    }
      

  3.   

    先建个hash表,表里是各个数的阶乘;hash表的大小可根据 N 来定。
    后枚举几个数,使其和能等于已知数的。
      

  4.   

    如果 a < b 那么有 (a+1)! - a! = a!*a < b!*b = (b+1)! - b!; ........(1)
    可知 f(x) 这个函数中相邻两项的差是递增的。
    有 F(x) = 1! + 2! + 3! + ... + x! >= N > F(x-1) = 1! +2! + 3! +....+ (x-1)!;
    这说明能符合条件的最多只有 x 个数;
    现在用指针分别标识这些数字;
    因为F(x) > N ;故除去 1!(因为 1!最小);
    继续循环下去判断,如果新数列大于N的话就除去最小的那个。
    如果新数列小于N的话就从小往大判断,移动一个能移动且增量最小的。这就是我证明(1)的原因。
    能移动的意思就是如果 k 在数列中 k+1 不在,这就是说 k 能移动;反之不能移动。