43. 字符串相乘-两个极大整数乘法

#define _CRT_SECURE_NO_DEPRECATE 1

#include<iostream>
#include<string>
using namespace std;

class Solution{
public:
	string multiply(string num1, string num2){
		if (num1.size() == 1 && num1[0] == '0')return num1;
		if (num2.size() == 1 && num2[0] == '0')return num2;

		size_t LSize = num1.size();
		size_t RSize = num2.size();
		if (LSize < RSize)
		{
			num1.swap(num2);
			swap(LSize, RSize);
		}
		string strRet;
		strRet.reserve(LSize + 1);

		char cRet = 1;
		char cstep = 0;
		string sum;
		sum.reserve(LSize + RSize);

		for (size_t i = 0; i < RSize; ++i)
		{
			strRet.clear();
			for (size_t j = 0; j < LSize; ++j)
			{
				cRet = (num1[LSize - j - 1] - '0')
					*(num2[RSize - i - 1] - '0') + cstep;
				cstep = 0;

				if (cRet > 9)
				{
					char temp = cRet;
					cRet = temp % 10;
					cstep = temp / 10;
				}
				

				strRet += cRet + '0';
			}
			if (cstep){
				strRet += cstep + '0';
				cstep = 0;
			}
			reverse(strRet.begin(), strRet.end());
			for (size_t z = 0; z < i; ++z)
			{
				strRet += '0';
			}
			sum = addStrings(sum, strRet);
		}
		return sum;
	}
//字符串加法
	string addStrings(string num1, string num2) {
		int LSize = num1.size();
		int RSize = num2.size();

		if (LSize < RSize)
		{
			num1.swap(num2);
			swap(LSize, RSize);

		}

		string strRet;
		strRet.reserve(LSize + 1);

		char step = 0;
		char retNumber = 0;

		for (size_t i = 0; i < num1.size(); ++i)
		{
			retNumber = num1[num1.size() - 1 - i] - '0' + step;
			step = 0;

			if (i < num2.size())
			{
				retNumber += num2[num2.size() - 1 - i] - '0';

			}

			if (retNumber > 9)
			{
				retNumber = retNumber - 10;
				step = 1;

			}

			strRet += retNumber + '0';

		}

		if (step)
		{
			strRet += '1';

		}

		reverse(strRet.begin(), strRet.end());

		return strRet;

	}
};


int main()
{
	string s1;
	string s2;
	getline(cin, s1);
	getline(cin, s2);
	Solution s;
	cout << s.multiply(s1, s2) << endl;
	return 0;
}

由于原题限制比较大,所以暴力破解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Karatsuba乘法是一种高效的大整数乘法算法,具有O(n^log2(3))的时间复杂度,比传统的乘法算法有更好的效率。下面是用C语言中的Karatsuba乘法去实现两个大整数相乘的步骤: 1.将两个大整数x和y分别拆分成两部分x1、x2和y1、y2,并计算z0 = x1 * y1,z2 = x2 * y2。 2.计算z1 = (x1 + x2) * (y1 + y2) - z0 - z2。 3.使用递归的方式计算x1 * y2和x2 * y1。 4.将z0、z1和z2合并起来,得到最终的结果。 以下是示例代码: ```c #include <stdio.h> #include <string.h> void karatsuba(char *x, char *y, char *z) { int n = strlen(x); if (n == 1) { int a = x[0] - '0'; int b = y[0] - '0'; int c = a * b; sprintf(z, "%d", c); return; } int m = n / 2; char x1[m + 1], x2[m + 1], y1[m + 1], y2[m + 1], z0[2 * m + 1], z1[2 * m + 1], z2[2 * m + 1]; strncpy(x1, x, m); strncpy(x2, x + m, n - m); strncpy(y1, y, m); strncpy(y2, y + m, n - m); x1[m] = '\0'; x2[n - m] = '\0'; y1[m] = '\0'; y2[n - m] = '\0'; karatsuba(x1, y1, z0); karatsuba(x2, y2, z2); char t1[2 * m + 1], t2[2 * m + 1]; int a = 0, b = 0, c = 0, i; for (i = m - 1; i >= 0; i--) { a = a * 10 + x1[i] - '0'; b = b * 10 + y1[i] - '0'; } c = a * b; sprintf(t1, "%d", c); for (i = strlen(t1) - 1; i >= 0; i--) { t1[i + m] = t1[i]; } for (i = 0; i < m; i++) { t1[i] = '0'; } t1[2 * m] = '\0'; for (i = m - 1; i >= 0; i--) { a = a * 10 + x2[i] - '0'; b = b * 10 + y2[i] - '0'; } c = a * b; sprintf(t2, "%d", c); for (i = strlen(t2) - 1; i >= 0; i--) { t2[i + m] = t2[i]; } for (i = 0; i < m; i++) { t2[i] = '0'; } t2[2 * m] = '\0'; karatsuba(x1 + m, y1 + m, z1); int l1 = strlen(z0); int l2 = strlen(z1); int l3 = strlen(z2); for (i = 0; i < l1 + l2 + l3; i++) { z[i] = '0'; } z[l1 + l2 + l3] = '\0'; for (i = 0; i < l1; i++) { z[i] = z0[i]; } for (i = 0; i < l2; i++) { z[m + i] += z1[i] - '0'; } for (i = 0; i < l3; i++) { z[2 * m + i] += z2[i] - '0'; } for (i = m; i < l1 + m; i++) { z[i] += t1[i - m] - '0'; } for (i = m; i < l3 + m; i++) { z[i] += t2[i - m] - '0'; } int carry = 0; for (i = 0; i < l1 + l2 + l3; i++) { z[i] += carry; if (z[i] > '9') { z[i] -= 10; carry = 1; } else { carry = 0; } } while (z[strlen(z) - 1] == '0') { z[strlen(z) - 1] = '\0'; } if (strlen(z) == 0) { strcpy(z, "0"); } } int main() { char x[] = "3141592653589793238462643383279502884197169399375105820974944592"; char y[] = "2718281828459045235360287471352662497757247093699959574966967627"; char z[1000]; karatsuba(x, y, z); printf("%s\n", z); return 0; } ``` 在这个示例代码中,我们使用递归的方式实现了Karatsuba乘法,并通过一个示例计算了两个大整数的乘积。在实现过程中,我们使用了字符串来表示大整数,并且通过字符串的复制和拼接来实现大整数的拆分和合并。这个示例代码可以帮助我们深入理解Karatsuba乘法的原理和实现方法,并且掌握如何使用C语言实现这个算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值