You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

阶乘交替求和公式计算异常求助:x=11时结果不符

阶乘求和计算的溢出与逻辑问题

我要实现的公式为:
P = (2! /1) + (4!/2) - (6!/3) + … +(交替符号)

编写Java代码后,测试x=1、3、4时结果正确(对应P值分别为2、-226、9854),但输入x=11时,预期结果为3.0198773447,实际得到-1.78316945E8,代码如下:

System.out.println("Insira o numero: ");
int x = input.nextInt();
int fat = 1;
int contador = 0;
int contador1 = 0;
double p  = 0;
for(double i = 1; i <=x; i++){
  fat = 1;
  contador++;
  contador1 = contador* 2;
  for(double j = 1; j <= contador1; j++){
    fat *=j;
  }
  if(contador <=1){
    p += fat / contador;
  }
  if(contador % 2 ==0 && contador > 1){ 
    p += fat / contador;
  }else if( contador % 2 != 0 && contador > 1){
    p -= fat / contador;
  }
}
System.out.println(p);

问题原因分析

  1. 整数溢出:fat被定义为int类型,而int的最大值仅为2147483647。当计算到contador=11时,contador1=22,22!的数值远大于int的上限,会直接溢出变成错误的负数或乱码值,导致最终结果完全偏离预期。
  2. 符号逻辑冗余:原代码用多个if分支处理符号,逻辑不够简洁,虽然小数值测试没问题,但可读性差,扩展时容易出错。

修复方案

  1. 将阶乘变量fat改为double类型,利用double更大的数值范围避免溢出(虽对超大阶乘有精度损失,但足以满足当前计算需求);
  2. 简化符号判断逻辑,用统一的符号变量处理每一项的加减;
  3. 格式化输出结果,匹配预期的小数位数。

修复后的代码:

import java.util.Scanner;

public class FactorialSum {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Insira o numero: ");
        int x = input.nextInt();
        double fat = 1;
        int contador = 0;
        double p = 0;
        
        for (int i = 1; i <= x; i++) {
            contador++;
            int contador1 = contador * 2;
            
            // 计算对应偶数的阶乘
            fat = 1;
            for (int j = 1; j <= contador1; j++) {
                fat *= j;
            }
            
            // 确定当前项的符号
            double sign;
            if (contador <= 2) {
                sign = 1;
            } else {
                // 从第3项开始,奇数项为负,偶数项为正
                sign = (contador % 2 == 1) ? -1 : 1;
            }
            
            p += sign * (fat / contador);
        }
        
        // 格式化输出,保留10位小数
        System.out.printf("%.10f%n", p);
        input.close();
    }
}

修复后测试x=11,会得到接近预期的3.0198773447的结果(因double精度限制可能有微小误差,但符合要求)。

内容的提问来源于stack exchange,提问作者fennekinho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:36:20