计算两个大整数相加减的结果,数字不是double类型能表示的,数字长度没有限制(最大127位)。
方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal;
方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平。
此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性。
1、主函数
import java.math.BigDecimal;
import java.util.Scanner;
public class Tao_add {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int i=10;
while(i>1){
System.out.print("输入第一个数:");
String s1=sc.next();
System.out.print("输入加或减号:");
String s2=sc.next();
System.out.print("输入第二个数:");
String s3=sc.next();
String s4=send(s1,s2,s3);
System.out.println("计算结果是:"+s4);
System.out.println("正确结果: "+ku_big(s1,s2,s3));
--i;
}
sc.close();
};
2、分发方法,流向加法操作还是减法操作。
public static String send(String s1,String s2,String s3){
if(!(check(s1)&&check(s3)&&(s2.equals("-")||s2.equals("+"))))
return "输入有非法字符";
String str=null;
if(s2.equals("+"))
str=add_first(s1,s3);
else
str=sub_first(s1,s3);
return str;
};
3、减法操作第一步
/*减法操作*/
public static String sub_first(String s1,String s2){
String sa[]=who_big(s1,s2);
if(sa[2].equals("+")||sa[2].equals("0"))
{
String s=integer_sub(s1,s2);
s=take_head_zero(s);
return s;
}
if(sa[2].equals("-"))
{
String s=integer_sub(s2,s1);
s=take_head_zero(s);
return "-"+s;
}
return null;
};
4、两个整数字符串相减
/*两个整数相减*/
public static String integer_sub(String s1,String s3){
int max=s1.length(),min=s3.length(),i=0;
String str="";
i=1;
int k=0,before=0;
while(i<=max){
if(i<=min)
k=s1.charAt(max-i)-s3.charAt(min-i)-before;
else
k=s1.charAt(max-i)-'0'-before;
if(k<0)
{
k+=10;
before=1;
}else
before=0;
str=k+str;
++i;
}
return str;
};
5、比较两个字符串谁打大谁小
/*比较两个数字()谁大,将大的放在[0],小的放在[1],正负号放在str[2]相等为0,*/
public static String[] who_big(String s1,String s2){
int len1=s1.length(),len2=s2.length();
String str[]=new String[3];
if(len1>len2)
{
str[0]=s1;
str[1]=s2;
str[2]="+";
return str;
}
if(len1<len2)
{
str[0]=s2;
str[1]=s1;
str[2]="-";
return str;
}
int i=0,k=0;
while(i<len1)
{
if(s1.charAt(i)==s2.charAt(i))
++i;
else
{
k=s1.charAt(i)-s2.charAt(i);
break;
}
}
if(k==0)/*两个数相等*/
{
str[0]=s1;
str[1]=s2;
str[2]="0";
}
if(k<0)/*s1小于2*/
{
str[0]=s2;
str[1]=s1;
str[2]="-";
}
else /*s1大于2*/
{
str[0]=s1;
str[1]=s2;
str[2]="+";
}
return str;
};
6、加法操作的第一步
public static String add_first(String s1,String s2){
int len1=s1.length(),len2=s2.length();
/*有些事要提前做!!!*/
if(len1>=len2)
return integer_add(s1,s2);
else
return integer_add(s2,s1);
};
7、两个大整数相加
public static String integer_add(String s1,String s2){
/*传递的时候已经确定第一个参数s1为最长字符串,s2为短字符串。*/
int len1=s1.length(),len2=s2.length();
int a,temp=0;
String str="";
for(int i=1;i<=len1;++i)
/*注意开始i=1,结束时i==len1,因为前面i是从1开始,后面结束要多算一位*/
{
if(i<=len2)
a=temp+(s1.charAt(len1-i)-'0')+(s2.charAt(len2-i)-'0');
else
a=temp+(s1.charAt(len1-i)-'0');
temp=a/10;
a=a%10;
str=a+str;
}
if(temp!=0)
str=temp+str;
/*消除最前面的数字0*/
int index=-1;
for(int i=0;i<str.length();++i)
if(str.charAt(i)!='0')
{
index=i;
break;
}
if(index!=-1&&index<str.length())
{
str=str.substring(index);
}
else
str="0";
return str;
};
8、剔除整数前面多余的零
/*剔除前面多余的数字0.*/
public static String take_head_zero(String s){
int len=s.length(),i=0;
while(i<len)
{
if(s.charAt(i)=='0')
++i;
else
break;
}
if(i<len)
s=s.substring(i);
else
s="0";
return s;
};
9、检查输入的字符串是否有非法字符
public static boolean check(String s){
int k=0;
for(int i=0;i<s.length();++i)
{
if(s.charAt(i)<='9'&&s.charAt(i)>='0')
{
if(s.charAt(i)=='.')
{ ++k;
if(k>=2)
return false;
}
}
else
return false;
}
return true;
};
10、利用库函数求大整数相加减
public static String ku_big(String s1,String s2,String s3){
BigDecimal b1;
BigDecimal b3;
BigDecimal b=new BigDecimal("0");
try{
b1=new BigDecimal(s1);
b3=new BigDecimal(s3);
if(s2.equals("+"))
b=b1.add(b3);
else
{ if(s2.equals("-"))
b=b1.subtract(b3);
else
return "输入有非法字符";
}
}catch(NumberFormatException e){
//System.out.println(e);
return "输入有非法字符";
}
return b.toString();
};
111、完整代码
import java.math.BigDecimal;
import java.util.Scanner;
public class Tao_add {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int i=10;
while(i>1){
System.out.print("输入第一个数:");
String s1=sc.next();
System.out.print("输入加或减号:");
String s2=sc.next();
System.out.print("输入第二个数:");
String s3=sc.next();
String s4=send(s1,s2,s3);
System.out.println("计算结果是:"+s4);
System.out.println("正确结果: "+ku_big(s1,s2,s3));
--i;
}
sc.close();
};
public static String send(String s1,String s2,String s3){
if(!(check(s1)&&check(s3)&&(s2.equals("-")||s2.equals("+"))))
return "输入有非法字符";
String str=null;
if(s2.equals("+"))
str=add_first(s1,s3);
else
str=sub_first(s1,s3);
return str;
};
/*减法操作*/
public static String sub_first(String s1,String s2){
String sa[]=who_big(s1,s2);
if(sa[2].equals("+")||sa[2].equals("0"))
{
String s=integer_sub(s1,s2);
s=take_head_zero(s);
return s;
}
if(sa[2].equals("-"))
{
String s=integer_sub(s2,s1);
s=take_head_zero(s);
return "-"+s;
}
return null;
};
/*两个整数相减*/
public static String integer_sub(String s1,String s3){
int max=s1.length(),min=s3.length(),i=0;
String str="";
i=1;
int k=0,before=0;
while(i<=max){
if(i<=min)
k=s1.charAt(max-i)-s3.charAt(min-i)-before;
else
k=s1.charAt(max-i)-'0'-before;
if(k<0)
{
k+=10;
before=1;
}else
before=0;
str=k+str;
++i;
}
return str;
};
/*比较两个数字()谁大,将大的放在[0],小的放在[1],正负号放在str[2]相等为0,*/
public static String[] who_big(String s1,String s2){
int len1=s1.length(),len2=s2.length();
String str[]=new String[3];
if(len1>len2)
{
str[0]=s1;
str[1]=s2;
str[2]="+";
return str;
}
if(len1<len2)
{
str[0]=s2;
str[1]=s1;
str[2]="-";
return str;
}
int i=0,k=0;
while(i<len1)
{
if(s1.charAt(i)==s2.charAt(i))
++i;
else
{
k=s1.charAt(i)-s2.charAt(i);
break;
}
}
if(k==0)/*两个数相等*/
{
str[0]=s1;
str[1]=s2;
str[2]="0";
}
if(k<0)/*s1小于2*/
{
str[0]=s2;
str[1]=s1;
str[2]="-";
}
else /*s1大于2*/
{
str[0]=s1;
str[1]=s2;
str[2]="+";
}
return str;
};
public static String add_first(String s1,String s2){
int len1=s1.length(),len2=s2.length();
/*有些事要提前做!!!*/
if(len1>=len2)
return integer_add(s1,s2);
else
return integer_add(s2,s1);
};
/*剔除前面多余的数字0.*/
public static String take_head_zero(String s){
int len=s.length(),i=0;
while(i<len)
{
if(s.charAt(i)=='0')
++i;
else
break;
}
if(i<len)
s=s.substring(i);
else
s="0";
return s;
};
public static boolean check(String s){
int k=0;
for(int i=0;i<s.length();++i)
{
if(s.charAt(i)<='9'&&s.charAt(i)>='0')
{
if(s.charAt(i)=='.')
{ ++k;
if(k>=2)
return false;
}
}
else
return false;
}
return true;
};
public static String integer_add(String s1,String s2){
/*传递的时候已经确定第一个参数s1为最长字符串,s2为短字符串。*/
int len1=s1.length(),len2=s2.length();
int a,temp=0;
String str="";
for(int i=1;i<=len1;++i)
/*注意开始i=1,结束时i==len1,因为前面i是从1开始,后面结束要多算一位*/
{
if(i<=len2)
a=temp+(s1.charAt(len1-i)-'0')+(s2.charAt(len2-i)-'0');
else
a=temp+(s1.charAt(len1-i)-'0');
temp=a/10;
a=a%10;
str=a+str;
}
if(temp!=0)
str=temp+str;
/*消除最前面的数字0*/
int index=-1;
for(int i=0;i<str.length();++i)
if(str.charAt(i)!='0')
{
index=i;
break;
}
if(index!=-1&&index<str.length())
{
str=str.substring(index);
}
else
str="0";
return str;
};
public static String ku_big(String s1,String s2,String s3){
BigDecimal b1;
BigDecimal b3;
BigDecimal b=new BigDecimal("0");
try{
b1=new BigDecimal(s1);
b3=new BigDecimal(s3);
if(s2.equals("+"))
b=b1.add(b3);
else
{ if(s2.equals("-"))
b=b1.subtract(b3);
else
return "输入有非法字符";
}
}catch(NumberFormatException e){
//System.out.println(e);
return "输入有非法字符";
}
return b.toString();
};
}
来源:https://www.cnblogs.com/duange/p/5999139.html