解决求很大数阶层时数据溢出的两种方法
来源:互联网 发布:火爆网络的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();
}
}
二:运行截图
- 解决求很大数阶层时数据溢出的两种方法
- 求水仙花数的两种方法
- 位数很大的阶层和
- 解决大数组定义时栈溢出的两种方法
- PostgreSQL中表的阶层数据取得方法
- 求大数的阶层
- 求n的阶层
- 求阶层的优化
- 求组合数(取模)的两种方法
- 求2^p的方法,p很大
- 用递归和迭代这两种方法求n的阶层:n!
- 求a,b两数的最大公约数的两种方法
- 解决android打包dex文件方法数溢出的问题
- 求一个很大的数的欧拉函数
- (hdu step 2.2.1)Fibonacci(求当n很大时的斐波那契数)
- uva 1404 求很大数的素数算法
- 求阶层
- 求两个数的公因数的两种方法java实现
- angular用ng-repeat遍历对象
- 链表一些操作
- 在service里面用dialog
- Studio结构的第三方库
- Python:10054错误
- 解决求很大数阶层时数据溢出的两种方法
- html5新增标签(上)
- 修改 myeclipse10中web-content-root经验
- mysql 去掉重复的有效操作,在对数据库做操作时请切记要做数据备份
- Adobe Photoshop CC Mac简体中文 硬解
- 并发的实质
- LeetCode OJ-20.Valid Parentheses
- KVO,NSNotification,delegate及block区别
- 小白学习Rxjava2,从零开始到实战(一) RxJava2的基础使用