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();
}
}
二:运行截图