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

如何避免long溢出?Java阶乘作业的BigInteger使用疑问

阶乘程序溢出问题与BigInteger改造方案

问题说明

作业要求实现程序:让用户输入数字并打印其阶乘;禁止输入负数或大于25的数字,输入不合规则则循环重新输入。原代码使用long存储数据,但输入20-25之间的数时会因long溢出导致结果变为负数。尝试改用BigInteger解决溢出,但所有涉及BigInteger的代码均报错,原代码如下:

boolean correctInputn= false;
    
while(!correctInputn)
{
    long number;// declares variables for storing number
    long factorial = 1;// declare variable for storing factorial
    

    System.out.println("Enter a number between 1 and 25"); // tells user to enter number
    number = scanner.nextLong();
    
    if (number <0)  
    {
        System.out.println("Positive numbers only");// if number entered is negative
        correctInputn = false; 
        continue;
    } // if user enters number less than 0 loops back to code start
   
    else if (number > 25)
    { 
        System.out.println("Number to large to print");
        correctInputn = false; 
        continue;
    } // if user enters number over 25 loops back to code start
    
    else  {
        // if user enter 10, counter starts at 10 and runs to two
        for(long mynumber = number; mynumber >= 1; mynumber--) {
            factorial = factorial*mynumber; // mynumber would contain different values and that is multiplied by value present in factorial value and stored again in factorial variable
        }
    
        System.out.println("The factorial of " + number +" is equal to " + factorial);
        break;
    }
}

解决方案

BigInteger是Java的大数处理类,不能像基本类型那样直接用=赋值、*运算,必须使用它提供的方法操作。以下是修改后的正确代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Factorial {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean correctInputn = false;
        
        while (!correctInputn) {
            long number;
            // 用BigInteger初始化阶乘为1
            BigInteger factorial = BigInteger.ONE;

            System.out.println("请输入1到25之间的数字");
            number = scanner.nextLong();

            if (number < 0) {
                System.out.println("只能输入正数");
                continue;
            } else if (number > 25) {
                System.out.println("数字过大,无法计算");
                continue;
            } else {
                for (long mynumber = number; mynumber >= 1; mynumber--) {
                    // 用multiply方法做乘法,将long转成BigInteger参与运算
                    factorial = factorial.multiply(BigInteger.valueOf(mynumber));
                }
                System.out.println(number + "的阶乘是:" + factorial);
                correctInputn = true; // 标记输入正确,退出循环
            }
        }
        scanner.close();
    }
}

关键修改点

  • 导入包:必须导入java.math.BigInteger才能使用该类
  • 初始化:BigInteger不能用1初始化,要使用常量BigInteger.ONE
  • 运算方式:不能用*做乘法,必须调用multiply()方法
  • 类型转换:将循环中的long类型变量通过BigInteger.valueOf()转成BigInteger才能参与运算
  • 循环标记:原代码中correctInputn在合法输入后未设为true,补充后逻辑更严谨

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:25:34