两个大整数相加减,数字比较长。

吃可爱长大的小学妹 提交于 2020-02-27 02:13:50

   

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

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!