设计一个java程序,完成:输入一个正整数n, 计算奇数阶乘和s=1!+3!+5!+…+n!。

题目要求

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。程序正确,同样在计算阶乘时注重连续性、累积结果。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值