如何避免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
相关产品推荐
相关产品推荐

