Multiply Strings

225 篇文章 0 订阅

参考了网上的一种解题思路,原网址找不到了。。   思路的话仔细看看会明白的,当时举了一个例子按照这个流程跑了下。这个思路还是很清晰的。

代码:

package codes;

public class MultiplyStrings {

	public static void main(String[] args) {
		String str1 = "9";
		String str2 = "99";
		System.out.print(new MultiplyStrings().multiply02(str1, str2));
		

	}
//	public String multiply(String num1, String num2) {
//          
//          if(num1.length()>10  || num2.length()>10){
//        	  return "" ;
//          }else { 
//        	  long temp1 = Long.parseLong(num1);
//              long temp2 = Long.parseLong(num2);
//              if(temp1>2147483647 || temp2>2147483647)
//            	  return "";
//              else
//              { 
//            	  long res = temp1 * temp2;
//            	 
//            	 
//            		  return res+"";
//              }
//          }
//    }
//	 public String multiply01(String num1, String num2) {
//    num1 = new StringBuilder(num1).reverse().toString();
//    num2 = new StringBuilder(num2).reverse().toString();
//    // even 99 * 99 is < 10000, so maximaly 4 digits
//    int[] d = new int[num1.length() + num2.length()];
//    for (int i = 0; i < num1.length(); i++) {
//        int a = num1.charAt(i) - '0';
//        for (int j = 0; j < num2.length(); j++) {
//            int b = num2.charAt(j) - '0';
//            d[i + j] += a * b;
//        }
//    }
//    StringBuilder sb = new StringBuilder();
//    for (int i = 0; i < d.length; i++) {
//        int digit = d[i] % 10;
//        int carry = d[i] / 10;
//        sb.insert(0, digit);
//        if (i < d.length - 1)
//            d[i + 1] += carry;
//        }
//    //trim starting zeros
//    while (sb.length() > 0 && sb.charAt(0) == '0') {
//        sb.deleteCharAt(0);
//    }
//    return sb.length() == 0 ? "0" : sb.toString();
//}
	 public String multiply02(String num1, String num2) {
		 int len = num1.length()+num2.length();
		 int res [] = new int [len];
		// StringBuffer sb = new 
		 String temp1 = new StringBuffer(num1).reverse().toString();
		 String temp2 = new StringBuffer(num2).reverse().toString();
		 for(int i = 0;i < temp1.length();i++){
			 int a = temp1.charAt(i) - '0';
			 for(int j = 0;j < temp2.length();j++){
				 int b = temp2.charAt(j) - '0';
				 res [i+j] += a * b;
			 }
		 }
//		 for(int i=0;i<res.length;i++){
//		   System.out.println(res[i]);
//		 }
		 // handle the array
		 StringBuffer sb = new StringBuffer();
		
		 for(int i=0 ; i<res.length;i++){
			 int digit = res[i] % 10;
			 int carry = res[i] / 10;
			sb.insert(0, digit);// 从前面插
			
			 if( i<res.length-1){
				 res[i+1] += carry; //res[i] = digit;
			 }
			 
		 }
		
		 //reverse
		 while(sb.length() > 0 && sb.charAt(0) == '0'){
			sb.deleteCharAt(0);
		 }
		 
		 return sb.length()==0?"0":sb.toString();
	 }
	

}



您可以使用字符串来实现高精度的加法和乘法运。下面是一个示例的实现代码: ``` def addStrings(num1, num2): # 将字符串转换为整数列表 n1 [int(x) for in num1] n = [int(x) for x in num2] # 对齐两个整数列表的长度 if len(n1) < len(n2): n1 = [0] * (len(n2) - len(n1)) + n1 else: n2 = [0] * (len(n1) - len(n2)) + n2 # 逐位相加 carry = 0 res = [] for i in range(len(n1)-1, -1, -1): total = n1[i] + n2[i] + carry carry = total // 10 res.append(str(total % 10)) # 如果还有进位,需要额外加一位 if carry: res.append(str(carry)) # 翻转并返回结果 return ''.join(res[::-1]) def multiplyStrings(num1, num2): # 将字符串转换为整数列表 n1 = [int(x) for x in num1][::-1] n2 = [int(x) for x in num2][::-1] # 初始化结果列表 res = [0] * (len(n1) + len(n2)) # 逐位相乘 for i in range(len(n1)): for j in range(len(n2)): res[i+j] += n1[i] * n2[j] res[i+j+1] += res[i+j] // 10 res[i+j] %= 10 # 去除前导零 while len(res) > 1 and res[-1] == 0: res.pop() # 翻转并返回结果 return ''.join(str(x) for x in res[::-1]) ``` 您可以使用`addStrings`函数进行两个字符串的加法运算,使用`multiplyStrings`函数进行两个字符串的乘法运算。例如: ```python num1 = "123456789" num2 = "987654321" print(addStrings(num1, num2)) # 输出:1111111110 print(multiplyStrings(num1, num2)) # 输出:121932631112635269 ``` 这样就可以实现高精度的加法和乘法运算了。希望对您有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值