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


       

         计算两个大整数相加减的结果,数字不是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();
    };
    
    }
  • 相关阅读:
    [bzoj1251]序列终结者
    Codeforces #Round 406(Div.2)
    [3.23校内训练赛]
    [APIO2009]
    [APIO2016]
    [bzoj1901]动态区间k大
    [9018/1904]火星商店
    [bzoj3673/3674可持久化并查集加强版]
    [bzoj1297][SCOI2009]迷路
    [bzoj1218][HNOI2003]激光炸弹
  • 原文地址:https://www.cnblogs.com/duange/p/5999139.html
Copyright © 2020-2023  润新知