Multiply Strings

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2.

Note:

  1. The length of both num1 and num2 is < 110.
  2. Both num1 and num2 contains only digits 0-9.
  3. Both num1 and num2 does not contain any leading zero.
  4. You must not use any built-in BigInteger library or convert the inputs to integer directly.

解决方案如下:

Remember how we do multiplication?

Start from right to left, perform multiplication on every pair of digits, and add them together. Let's draw the process! From the following draft, we can immediately conclude:

 `num1[i] * num2[j]` will be placed at indices `[i + j`, `i + j + 1]` 

代码如下:

public class MultiplyStrings {

	public static void main(String[] args) {
		System.out.println(multiply("123","456"));
	}
	
	public static String multiply(String num1,String num2){
		int m = num1.length(),n = num2.length();
		int[] pos = new int[m+n];
		
		for(int i=m-1;i>=0;i--){
			for(int j=n-1;j>=0;j--){
				int mul = (num1.charAt(i)-'0')*(num2.charAt(j)-'0');
				int p1 = i+j , p2 = i+j+1;
				int sum = mul +pos[p2];		//注意加上上一步的结果
				System.out.println(pos[p1]+"__"+pos[p2]);
				pos[p1] += sum/10;		
				pos[p2] = sum%10;
			}
		}
		
		StringBuilder sb = new StringBuilder();
		for(int p : pos){
			if(!(sb.length() == 0 && p==0))
				sb.append(p);
		}
		
		return sb.length() == 0 ? "0" : sb.toString();
		
	}
}



在C++中计算高精度的a的b次方通常涉及到大数乘法运算,因为直接对整数进行幂运算可能会导致溢出。一种常见的方法是使用辗转相除法(也称欧几里得算法)来实现幂运算,同时结合位操作提高效率。以下是使用字符串(因为C++的内置数据类型无法表示任意大的整数)的一个简单示例: ```cpp #include <string> #include <sstream> std::string highPrecisionPow(const std::string& a, int b) { std::string result = "1"; // 初始化结果为1 for (int i = 0; i < b; ++i) { if ((b >> i) & 1) { // 如果当前位是1,需要将a乘入结果 long long temp = powerToDecimal(a); // 将字符串转换为整数并计算临时结果 result = multiplyStrings(result, a); // 使用字符串乘法函数 result = subtractIfOverflow(result, temp); // 检查是否溢出并减去多余的1 } a = multiplyStrings(a, a); // 双倍a以准备下一轮的平方 } return result; } // 辅助函数:字符串乘法 std::string multiplyStrings(const std::string& str1, const std::string& str2) { // 省略具体的字符串乘法逻辑,可以手动模拟每一位的加法或使用更高效的库 // ... } // 辅助函数:检查并处理溢出 std::string subtractIfOverflow(const std::string& str, long long value) { // 根据str的长度和value判断是否溢出,这里省略了具体实现 // ... } long long powerToDecimal(const std::string& num) { // 将字符串转换为长整型 long long decimal = std::stoll(num); return decimal; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值