【LeetCode-05】43字符串相乘

题目

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:

输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:

num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路

在这里插入图片描述

运用到的小知识点:

  1. SpringBuilder的拼接与翻转 很方便
  2. 在计算时只能一位数×一位数,所以 进位要暂时存放在 carry变量里,
    • 当前temp=(n1*n2+carry)%10; 把temp值拼接到字符串之后,最后进行翻转即可
    • 新的carry =(n1*n2+carry)/10;

代码


	public static void main(String[] args) {
		String string = multiply("123456789", "987654321");
		System.out.println(string);
		//System.out.println(123456789*3);
	}
	
	public static String  multiply(String num1, String num2) {
		
		if(num1.equals("0")||num2.equals("0")){
			return "0";
		}
			
		int carry = 0;String sum = "0";
		List<String> list = new ArrayList<String>();
		int[] res = new int[num2.length()];
		for (int i = num2.length()-1,n=0; i >= 0 ; i--,n++) {
			//每次进行新的运算,carry值都要清0
			carry=0;
			int n1 = num2.charAt(i)-'0';
			System.out.println("n1=--->"+n1);
			StringBuilder sBuilder = new StringBuilder();
		    for (int j = num1.length()-1; j >= 0; j--) {
				int n2 = num1.charAt(j)-'0'; 
				
				int temp = (n1*n2+carry)%10;
				sBuilder.append(temp);
				carry=(n1*n2+carry)/10;
				//当乘到最后一位时,需要把进位也拼接到后面
				if(j==0){
					if(carry!=0){
						sBuilder.append(carry);
					}
				}
			}
		    sBuilder = sBuilder.reverse();
		    for (int j = 0; j < n; j++) {
					sBuilder.append(0);
			}
		    list.add(sBuilder.toString());
		    System.out.println(sBuilder);
		    sum=addStrings(sum,sBuilder.toString());
		  
		}
		
		return sum+"";
    }

    /**
     * 对两个字符串数字进行相加,返回字符串形式的和
     */
    public static String addStrings(String num1, String num2) {
        StringBuilder builder = new StringBuilder();
        int carry = 0;
        for (int i = num1.length() - 1, j = num2.length() - 1;
             i >= 0 || j >= 0 || carry != 0;
             i--, j--) {
            int x = i < 0 ? 0 : num1.charAt(i) - '0';
            int y = j < 0 ? 0 : num2.charAt(j) - '0';
            int sum = (x + y + carry) % 10;
            builder.append(sum);
            carry = (x + y + carry) / 10;
        }
        return builder.reverse().toString();
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值