题目:
希望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
}
}
先删除了,看错了,这是乘积,看成求和了。
这用的不就是递归吗