/*思路:由目标式子可见分为两个部分。一个为每一项求阶乘数,另外一个为求和。所以写两个方法就可以解决。*/
public class PracticeDemo {
//递归方法求每一位的阶乘,返回为该数的阶乘。从1开始
public static long Recursion(int a)
{
long value = 0;
if(1 == a )
{
value = 1;
}
else if(1 < a)
{
value = a * Recursion(a-1);
}
return value;
}
//阶乘求和从0到b的阶乘之和
public static long Summation(int b)
{
long Sum = 0;
if(0 > b)
{
return -1;
}
else
{
while(0 < b)
{
System.out.print(b+"!+");
Sum += Recursion(b);
b--;
}
System.out.print("0!=");
return Sum+1; //加上0的阶乘
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入你要求的目标数:");
int a = input.nextInt();
PracticeDemo trf = new PracticeDemo();
System.out.println(trf.Summation(a));
}
}
//改进方法
/*此方法利用一个for循环。时间复杂度为O(n)。在循环里面两个变量,一个用于每次i++成为下一个数的阶乘;另一个为求和变量*/
Scanner input = new Scanner(System.in);
System.out.println("请输入你要求的目标数:");
int a = input.nextInt();
int temp = 1;
int sum = 0;
for(int i = 1;i <= a;i++)
{
temp *= i; //用于计算每一个阶乘
sum += temp ; //阶乘累加
System.out.print(i+"!+");
}
System.out.println("0="+sum);