数字方面的问题,请给个思路

题目:

img

希望java语言完成,效率尽可能高。输入整数N(正整数 负整数),输出结果 和 运行时间ms

能提供点思路也好,谢谢各位!

两种方法
[1]时间复杂度为o(1),空间复杂度为o(n)
[2]时间复杂度为o(n),空间复杂度为o(1)
法①其实也就是空间换时间的意思

public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    System.out.println("请输入n的值:");
    int n=sc.nextInt();
    long result=result(n);
    System.out.println("结果为:"+result(n));
}
public static long result(int a){
    long result=a;
    //大于0
    if(a>0) {
        /**偶数*/
        if (a % 2 == 0) {
            for(int i=a-2;i!=2;i=i-2) {
                result = result * i;
            }
        }
        /**基数*/
        else {
            for(int i=a-2;i!=1;i=i-2) {
                result = result * i;
            }
        }
    }
    //小于0
    else
    {
        /**偶数*/
        if (a % 2 == 0) {
            for(int i=a-2;i!=(2*i+2);i=i-2) {
                result = result * i;
            }
        }
        /**基数*/
        else {
            for(int i=a-2;i!=(2*i+1);i=i-2) {
                result = result * i;
            }
        }
    }
    return result;
}

法二:递归法以空间换时间,空间复杂度O(n),时间复杂度O(1)

import java.util.Scanner;

public class dome3 {
    public static void main(String[] args) {
     Scanner sc=new Scanner(System.in);
        System.out.println("请输入n的值:");
        int n=sc.nextInt();
        long result;
        if(n>0){
            if(n%2==0){
                result=fac2(n);
            }
            else{
                result=fac1(n);
            }
        }
        else{
            if(n%2==0){
                result=fac4(n);
            }
            else{
                result=fac3(n);
            }
        }
        System.out.println("结果为:"+result);

    }
    /**限制条件:n>0&&n为基数*/
    public static long fac1(int n){
        if(n==1){               //设立结束条件
            return 1;          //如果n=1那就返回1
        }
        return n*fac1(n-2);  //如果n不等于1那就返回n*fac(n-2)继续调用函数直到n=1
    }
    /**限制条件:n>0&&n为偶数*/
    public static long fac2(int n){
        if(n==2){               //设立结束条件
            return 2;          //如果n=2那就返回2
        }
        return n*fac2(n-2);  //如果n不等于2那就返回n*fac(n-2)继续调用函数直到n=2
    }
    /**限制条件:n<0&&n为基数*/
    public static long fac3(int n){
        if(n==n*2+1){               //设立结束条件
            return n*2+1;          //如果n=n*2+1那就返回n*2+1
        }
        return n*fac3(n-2);  //如果n不等于n*2+1那就返回n*fac(n-2)继续调用函数直到n=n*2+1
    }
    /**限制条件:n<0&&n为偶数*/
    public static long fac4(int n){
        if(n==n*2+2){               //设立结束条件
            return n*2+2;          //如果n=n*2+2那就返回n*2+2
        }
        return n*fac4(n-2);  //如果n不等于n*2+2那就返回n*fac(n-2)继续调用函数直到n=n*2+2
    }

}


先删除了,看错了,这是乘积,看成求和了。

这用的不就是递归吗