解决求很大数阶层时数据溢出的两种方法

来源:互联网 发布:火爆网络的ann是谁 编辑:程序博客网 时间:2024/05/19 20:01

1.代码

package test;

 

import java.util.*;

import java.io.IOException;

 public class Test5{

 

 public void Transport(long n){

   int s=1;

   for(int i=1;i<=n;i++)

   s*=i;

   System.out.println(n+"!的阶层是"+s);

   Testnumber();

}

 

public void Testnumber(){

  Scanner in=new Scanner(System.in);

  long n=0;

  System.out.println("输入你需要转化成阶层的整数");

 try{

  n=in.nextInt();//输入你需要转化成阶层的整数

 }catch(Exception e){

   e.printStackTrace();

}

  if(n<0)

  n=in.nextInt();

  Transport(n);

}

 

 public Test5(){

 Testnumber();

 }

 

 

public static void main(String args[]){

  Test5 p=new Test5();

}

 

}

 

2.

测试设计

Java代码进行测试,包括

n= 1~10

n=20

n=30

n=50

 

 

 

3.分析:发现当输入20的阶层时就出现了负数,这种情况是数据溢出,因为int总共是32位即是(2^31-1),数据太大时就会出现符号位不为0而是1变成了负数从而出现溢出,并且不能由于溢出而向上扩展到33位甚至更多的情况。

 

 

4.解决方法一:由于int型的限制我们只有修改数据类型,从而满足更多位的扩展:将输入测试的数据类型改为double型即可:如下图

 

5.解决方法二采用了BigInteger类型的数据

一:代码

package test;

 

import java.util.*;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import java.io.IOException;

import java.math.BigInteger;

 public class Test5{

 

 

 public void Transport(){

    fun();

    Transport();

}

 

 public void fun(){

 BigInteger result=Testnumber();

 System.out.println("阶层的结果是"+result);   

 }

 

//正则表达式判断字符串是否全是数字

public void A1(String num){

String regex="[0-9]*";

String num1=num;

Pattern p=Pattern.compile(regex);

Matcher t=p.matcher(num);

if(!t.matches()){

 System.out.println("你的输入有误,请重新输入:");

 Testnumber();

}

}

 

public BigInteger Testnumber(){

  Scanner in=new Scanner(System.in);

  BigInteger result =new BigInteger("1");

  System.out.println("输入你需要转化成阶层的整数");

  String n="";

  n=in.nextLine();//输入你需要转化成阶层的整数

  A1(n);

  int k=Integer.parseInt(n);

  if(k<0)

  n=in.toString();

  else if(k==0){

         return new BigInteger("1");  

     }

 

  if(k<0){  

          System.err.println("请输入不小于0的整数");  

          return new BigInteger("-1");  

      }  

  

  

  else {  

          for(;k>0;k--){  

           //System.out.println(k);

              result =result.multiply(new BigInteger(k+""));  

          }  

      }  

  

  

    return result;

}

 

 public Test5(){

 Transport();

 }

 

 

public static void main(String args[]){

  Test5 p=new Test5();

}

 

}

 

二:运行截图

 

 

0 0