两个大整数相加减,数字比较长。
计算两个大整数相加减的结果,数字不是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(); }; }