题目要求
1)首先设计一个方法(方法名自取,最好能贴合方法的功能含义),完成:输入一个正整数n, 计算s=1!+3!+5!+…+n!。若n是奇数,则计算到n!。若n是偶数,则计算到(n-1)!。请思考该方法有几个输入参数?该方法的返回值是什么类型?
2)在public static void main(String[] args)方法中,通过Scanner类读入一个整数值,如:5,然后通过调用1)定义的方法,向这个方法传入刚读入的这个值进去,将该方法的返回值,在屏幕上按指定格式输出。
求解思路
1)在方法设计中采用for循环来累积奇数阶乘,同时求和。这里的强调的是边累积边求和!
2)在main 方法中实现输入输出
具体代码
import java.util.Scanner;
public class Main
{
public static long calculateOddFactorialSum(int n) {
long sum = 1;//因为i从1开始的话,i-1会出现零的情况,所以将1先考虑进第一个阶乘、第一个接触和
long factorial = 1;
int increment = (n % 2 == 0) ? -1 : 0; // 根据n的奇偶性决定步长
for (int i = 3; i <= (n + increment); i=i+2) {
factorial= factorial*(i-1)*i;// 累积计算阶乘
sum=sum+factorial;
}
return sum;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个正整数值:");
int n = scanner.nextInt();
long result = calculateOddFactorialSum(n);
System.out.println("s=" + result);
scanner.close();
}
}
案例思考
思考1:本题在设计时,先累积后求和,可行否?
1)首先设计一个方完成:输入一个正整数n, 计算n!。
2)再设计一个方法,计算s=1!+2!+…+n!。方法是:利用一个for循环(i=1,2,3,…,n), 通过调用1)这个方法计算i!值并累加到s上,最后返回这个s值。
3)在public static void main(String[] args)方法中,通过Scanner类读入一个整数值,如:5,然后通过调用2)定义的方法,向这个方法传入刚读入的这个值进去,将该方法的返回值,在屏幕上按指定格式输出。
import java.util.Scanner;
public class Main{
public static long calculateOddFactorialSum(int n) {
long sum = 0;
long factorial = 1;
for (int i = 1; i <= n; i += 2) {
factorial = calculateFactorial(i);
sum += factorial;
}
return sum;
}
// 辅助方法:计算阶乘
private static long calculateFactorial(int number) {
long result = 1;
for (int factor = 2; factor <= number; factor++) {
result *= factor;
}
return result;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个正整数值:");
int n = scanner.nextInt();
System.out.println("s=" + calculateOddFactorialSum(n));
scanner.close();
}
}
这样的设计有什么问题?
问题在于:性能太差!
比如:i=3时,已计算出来3!,当i=5时,计算5!时,其中包含的3!部分在上一步3!中已计算过。
调用1)这个方法计算n!(n为奇数)时,并没有利用(n-2)!已计算过这个优点,而是又是重头计算。
因此,以后在设计方法时,注意:若有重复计算的情况,要想法避免,不要重复计算从而导致性能较差。
思考2:增设私有方法+for循环计算累积阶乘
import java.util.Scanner;
public class Main {
//计算阶乘
private static long calculateFactorial(int number) {
long factorial = 1;
for (int i = 2; i <= number; i++) {
factorial *= i;
}
return factorial;
}
// 计算奇数阶乘和
public static long calculateOddFactorialSum(int n) {
long sum = 0;
// 根据n的奇偶性确定起始值和结束值
int start = (n % 2 == 0) ? (n - 1) : n;
for (int i = 1; i <= start; i += 2) {
sum += calculateFactorial(i);
}
return sum;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个正整数值:");
int n = scanner.nextInt();
long sum = calculateOddFactorialSum(n);
System.out.println("s=" + sum);
scanner.close();
}
}
在这个实现中,calculateOddFactorialSum
方法首先确定起始值,如果n是偶数,起始值为n-1,否则就是n。然后,使用一个循环来计算奇数阶乘的和,步长为2以确保只计算奇数阶乘。每次循环调用 calculateFactorial
方法来计算当前奇数的阶乘,并将结果累加到 sum
中。
例如,如果输入的 n
是5,那么计算的阶乘将是1! + 3! + 5!,结果应该是1 + 6 + 120 = 127。程序正确,同样在计算阶乘时注重连续性、累积结果。