大整数相乘(JAVA模拟)

题目

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

输入描述:
空格分隔的两个字符串,代表输入的两个大整数
输出描述:
输入的乘积,用字符串表示

示例1
输入
72106547548473106236 982161082972751393
输出
70820244829634538040848656466105986748

题目链接:https://www.nowcoder.com/practice/0f0badf5f2204a6bb968b0955a82779e?tpId=90&tqId=30777&tPage=1&rp=1&ru=/ta/2018test&qru=/ta/2018test/question-ranking

题解

求x*y,首先分情况讨论x,y的正负情况。
然后写一个子函数来处理正乘正的情况。
直接模拟即可。

代码

import java.util.*;
import java.io.*;
import java.math.*;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String x,y,ans;
        while(in.hasNext()) {
        	x=in.next();
            y=in.next();
            ans=mul(x,y);
            System.out.println(ans);
        }
        
    }
    
    public static String mul(String x,String y){
        if(x.charAt(0)=='-' && y.charAt(0) =='-') return _mul(x.substring(1),y.substring(1));
        if(x.charAt(0)=='-' && y.charAt(0)!='-') return _mul(x.substring(1),y);
        if(x.charAt(0)!='-' && y.charAt(0)!='-') return _mul(x,y);
        if(x.charAt(0)!='-' && y.charAt(0)=='-') return _mul(x,y.substring(1));
        return "0";
    }
    
    public static String _mul(String x,String y){
        String ans="0";
        int cnt=0;
        y=new StringBuffer(y).reverse().toString();
        while(true){
            if(x.length()==0) break;
            char ch=x.charAt(x.length()-1);
            int carry=0;
            String tmp="";
            for(int i=0;i<y.length();i++){
                carry=carry+(y.charAt(i)-'0')*(ch-'0');
                tmp+=""+carry%10;
                carry/=10;
            }
            tmp+=carry;
            tmp=new StringBuffer(tmp).reverse().toString();
            
            for(int i=0;i<cnt;i++){
                tmp+="0";
            }
            cnt++;
           
            ans=add(ans,tmp);
            x=x.substring(0,x.length()-1);
        }
        if(ans.equals("")) ans="0";
        return ans;
    }
    
    public static String add(String x,String y){
        int k=0;
        while(k<x.length() && x.charAt(k)=='0') k++;
        x=x.substring(k);
        k=0;
        while(k<y.length() && y.charAt(k)=='0') k++;
        y=y.substring(k);
        
        
        x=new StringBuffer(x).reverse().toString();
        y=new StringBuffer(y).reverse().toString();
        
        String ans="";
        int carry=0,i,j;
        for(i=0,j=0;i<x.length()&&j<y.length();i++,j++){
            carry+=(x.charAt(i)-'0')+(y.charAt(j)-'0');
            ans+=carry%10;
            carry/=10;
        }
        
        for(;i<x.length();i++){
            carry+=x.charAt(i)-'0';
            ans+=carry%10;
            carry/=10;
        }
        
        for(;j<y.length();j++){
            carry+=y.charAt(j)-'0';
            ans+=carry%10;
            carry/=10;
        }
        
        ans+=carry;
        ans=new StringBuffer(ans).reverse().toString();
        k=0;
        while(k<ans.length() && ans.charAt(k)=='0') k++;
        ans=ans.substring(k);
        if(ans.equals("")) ans="0";
        return ans;
    }
}

心得

一开始WA了,因为没有主要String中==与equals的区别。

==是判断是否是同一对象,equals是判断内容是否相同。
所以一般尽量使用equals比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值