给定两个分别具有给定长度N和M的字符串str1和str2 ,每个字符串表示一个大数字,任务是使用10的补码从另一个中减去一个。
例子:
Input: N = 10, str1 = “3434243434”, M = 14, str2 = “22324365765767”
Output: 22320931522333
Input: N = 20, str1 = “12345334233242431433”, M = 20, str2 = “12345334233242431432”
Output: 1
方法:基本思想类似于使用2的补码对两个数字进行减法。
Subtraction of given strings can be written as
Str1 – Str2 = Str1 + (- Str2) = Str1 + (10’s complement of Str2)
请按照以下步骤解决问题:
- 比较两个字符串的长度,并将其中两个较小的字符串存储在str2中。
- 计算str2的10的补码。
- 现在,将str2的10的补码添加到str1 。
- 如果产生任何进位,则丢弃进位。
- 如果没有产生进位,则对str1的称赞是最终答案。
下面是上述方法的实现:
C++
// C++ Program to calculate the
// subtraction of two large number
// using 10's complement
#include
using namespace std;
// Function to return sum of two
// large numbers given as strings
string sumBig(string a, string b)
{
// Compare their lengths
if (a.length() > b.length())
swap(a, b);
// Stores the result
string str = "";
// Store the respective lengths
int n1 = a.length(), n2 = b.length();
int diff = n2 - n1;
// Initialize carry
int carry = 0;
// Traverse from end of both strings
for (int i = n1 - 1; i >= 0; i--) {
// Compute sum of
// current digits and carry
int sum
= ((a[i] - '0')
+ (b[i + diff] - '0') + carry);
// Store the result
str.push_back(sum % 10 + '0');
// Update carry
carry = sum / 10;
}
// Add remaining digits of str2[]
for (int i = n2 - n1 - 1; i >= 0; i--) {
int sum = ((b[i] - '0') + carry);
str.push_back(sum % 10 + '0');
carry = sum / 10;
}
// Add remaining carry
if (carry)
str.push_back(carry + '0');
// Reverse resultant string
reverse(str.begin(), str.end());
return str;
}
// Function return 10's
// complement of given number
string compliment10(string v)
{
// Stores the compliment
string compliment = "";
// Calculate 9's compliment
for (int i = 0; i < v.size(); i++) {
// Subtract every bit from 9
compliment += '9' - v[i] + '0';
}
// Add 1 to 9's compliment
// to find 10's compliment
compliment = sumBig(compliment, "1");
return compliment;
}
// Function returns subtraction
// of two given numbers as strings
string subtract(string a, string b)
{
// If second string is larger
if (a.length() < b.length())
swap(a, b);
// Calculate respective lengths
int l1 = a.length(), l2 = b.length();
// If lengths aren't equal
int diffLen = l1 - l2;
for (int i = 0; i < diffLen; i++) {
// Insert 0's to the beginning
// of b to make both the lengths equal
b = "0" + b;
}
// Add (complement of B) and A
string c = sumBig(a, compliment10(b));
// If length of new string is greater
// than length of first string,
// than carry is generated
if (c.length() > a.length()) {
string::iterator it;
// Erase first bit
it = c.begin();
c.erase(it);
// Trim zeros at the begnning
it = c.begin();
while (*it == '0')
c.erase(it);
return c;
}
// If both lengths are equal
else {
return compliment10(c);
}
}
// Driver Code
int main()
{
string str1 = "12345334233242431433";
string str2 = "12345334233242431432";
cout << subtract(str1, str2) << endl;
return 0;
}
输出:
1
时间复杂度: O(max(N,M))
辅助空间: O(max(N,M))