LeetCode进阶之路( Multiply Strings)

本文介绍了一种解决两个大数字符串相乘的问题的方法。通过逐位相乘和逐位相加的方式,避免使用BigInteger等内置大数处理库,实现了一个自定义的字符串大数相乘算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note:

  • The numbers can be arbitrarily large and are non-negative.
  • Converting the input string to integer is NOT allowed.

  • You should NOT use internal library such as BigInteger
题目:两个数字字符串相乘,求解,因为是字符串,肯定会超过Integer的最大值,但是没想到也同时超过了long的最大值,这个是后面提交后发现的。
思路:针对超过整型限制的题目,一般按照我们自己计算的思路来,例如这道题目,求两个数的积,一般都是一位一位去乘,最后把和加起来,这里我们也可以采用这种思路,同时,最后加也要用这种思路来解。我的这种解法复杂了点,但是比较好理解,先用乘数的每一位去乘被乘数,得到一个字符串数组,在把数组中全部加起来。
public String multiply(String num1, String num2) {
        if(num1.equals("0") || num2.equals("0")) {
			return "0";
		}
		String[] str = new String[num2.length()];
		int k = 0;
		for(int i = num2.length()-1;i >= 0;i--) {
			StringBuffer s = new StringBuffer();
			int n2 = num2.charAt(i) - '0';
			int flag = 0;
			for(int j = num1.length()-1; j >= 0; j--) {
				int n1 = num1.charAt(j) - '0';
				int a = (n1*n2 + flag)%10;
				flag = (n1*n2 + flag)/10;
				s.append(a);
			}
			if(flag != 0) {
				s.append(flag);
			}
			s.reverse();
//			sum = sum + Long.parseLong(s.reverse().toString())*k;
			for(int z = 0; z < k ;z++) {
				s.append("0");
			}
			str[k] = s.toString();
			k++;
		}
		
		return plus(str);
    }
	
	public String plus(String[] str) {//处理数组

		String s = new String();
		for(int i = 0; i < str.length;i++) {
			int[] sarr = stringToArray(s);
			int[] starr = stringToArray(str[i]);
			s = jia(sarr, starr);
			StringBuffer st = new StringBuffer(s);
			st.reverse();
			s = st.toString();
		}
		return s;
	}
	public String jia(int[] arr1, int[] arr2) { //处理字符串相加,先把字符串转换成整型岁的数组,在一位位相加。
		StringBuffer s = new StringBuffer();
		int[] big;
		int[] small;
		if(arr1.length <= arr2.length) {
			big = arr2;
			small = arr1;
		} else {
			big = arr1;
			small = arr2;
		}
		int flag = 0;
		for(int i = 0;i < small.length;i++) {
			int sum = small[i] + big[i] + flag;
			if(sum >= 10) {
				flag = sum/10;
			} else{
			    flag = 0;
			}
			s.append(sum%10);
		}
		for(int i = small.length; i < big.length;i++) {
			int b = big[i] + flag;
			s.append(b%10);
			flag = b/10;
		}
		if(flag > 0) {
			s.append(flag);
		}
		return s.toString();
		
	}
	public int[] stringToArray(String s) {//字符串变成数组
		int[] arr = new int[s.length()];
		int j = 0;
		for(int i = s.length()-1; i >=0;i--) {
			arr[j++] = s.charAt(i) - '0';
		}
		return arr;
	}
跳过了42题,看了半天实在没思路,感觉思考上被局限了,绞尽脑子也没头绪,先放过这题,后面在来做。

种一棵树最好的时间是十年前,其次是现在!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值