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

   

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们有两个大整数num1和num2,我们可以使用链表来存储它们,每个节点存储一个数字。为了方便计算,我们可以将链表尾部对齐,不足的地方用0填充。 首先,我们从链表头开始遍历两个链表,同时将每个节点的数字加,并记录进位。如果某一链表先到达尾部,那么我们可以将其余部分视为0继续加。最终,我们可以得到一个新的链表,它存储了加后的结果。 需要注意的是,如果最高位有进位,我们需要在结果链表的头部添加一个节点,表示进位。 下面是代码实现: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def addTwoNumbers(self, num1: ListNode, num2: ListNode) -> ListNode: # 将链表对齐 len1 = self.getLength(num1) len2 = self.getLength(num2) if len1 > len2: num2 = self.padList(num2, len1-len2) else: num1 = self.padList(num1, len2-len1) # 加 carry = 0 dummy = ListNode() curr = dummy while num1: total = num1.val + num2.val + carry carry = total // 10 curr.next = ListNode(total % 10) curr = curr.next num1 = num1.next num2 = num2.next # 处理最高位的进位 if carry: curr.next = ListNode(carry) return dummy.next def getLength(self, head: ListNode) -> int: n = 0 while head: n += 1 head = head.next return n def padList(self, head: ListNode, n: int) -> ListNode: for i in range(n): head = ListNode(0, head) return head ``` 时间复杂度为O(max(m,n)),其中m和n分别为两个链表的度。空间复杂度为O(max(m,n)),因为我们需要创建一个新的链表来存储结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值