阶乘交替求和公式计算异常求助: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);
问题原因分析
- 整数溢出:
fat被定义为int类型,而int的最大值仅为2147483647。当计算到contador=11时,contador1=22,22!的数值远大于int的上限,会直接溢出变成错误的负数或乱码值,导致最终结果完全偏离预期。 - 符号逻辑冗余:原代码用多个if分支处理符号,逻辑不够简洁,虽然小数值测试没问题,但可读性差,扩展时容易出错。
修复方案
- 将阶乘变量
fat改为double类型,利用double更大的数值范围避免溢出(虽对超大阶乘有精度损失,但足以满足当前计算需求); - 简化符号判断逻辑,用统一的符号变量处理每一项的加减;
- 格式化输出结果,匹配预期的小数位数。
修复后的代码:
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
相关产品推荐
相关产品推荐

