我在论坛上四处寻找,但仍然找不到我的问题的答案。 我有两个字符串,它们实际上是一个数字数组。例如(我只是选择随机数
string input1="12345678909876543212";
string input2="12345";
我想将这两个字符串加在一起,但将它们当作整数。 我的目标是创建一个类,我可以在其中添加比 (long long int) 更大的数字,这样它就可以超过最大的 long long int 变量。
所以我毫无问题地反推了字符串,所以现在好了
input1="21234567890987654321"
input2="54321"
然后我尝试添加,比方说 input1[0]+input2[0] (2+5) 到一个新字符串,让我们称它为 newString[0],它等于 (7);但我找不到一种好方法来临时转换字符串中的当前数字,以便我可以将它添加到新字符串中?谁能帮忙。我厌倦了 atoi、stof、stod。他们似乎根本不适合我。 我可以通过任何方式使此功能正常工作。 我还不关心制作类(class),我只关心找到一种方法来以数学方式添加这两个字符串,但仍然保持 newString 的字符串格式。谢谢谁能帮我解决这个问题
最佳答案
好吧,假设你唯一的问题是逻辑,而不是类设计,我想出了这个逻辑
- 用0填充输入,检查长度,匹配长度
- 像正常添加一样添加,跟踪进位
- 最终从结果中删除前导零
所以使用 std::transform
在反向迭代器上使用 lambda 函数:-
char carry = 0;
std::transform(input1.rbegin(),input1.rend(),input2.rbegin(),
result.rbegin(),[&carry]( char x, char y){
char z = (x-'0')+(y-'0') + carry;
if (z > 9)
{
carry = 1;
z -= 10;
}
else
{
carry = 0;
}
return z + '0';
});
//And finally the last carry
result[0] = carry + '0';
//Remove the leading zero
n = result.find_first_not_of("0");
if (n != string::npos)
{
result = result.substr(n);
}
参见 Here
编辑 “你能评论一下你在这里做什么吗”
+--------+--------------+------------+-------> Reverse Iterator
| | | |
std::transform( | input1.rbegin(), input1.rend(),input2.rbegin(),
result.rbegin(), [&carry]( char x, char y){
//This starts a lambda function
char z = (x-'0')+(y-'0') + carry; // x,y have ASCII value of each digit
// Substracr ASCII of 0 i.e. 48 to get the "original" number
// Add them up
if (z > 9) //If result greater than 9, you have a carry
{
carry = 1; // store carry for proceeding sums
z -= 10; // Obviously
}
else
{
carry = 0; //Else no carry was generated
}
return z + '0'; // Now you have "correct" number, make it a char, add 48
});
std::transform
出现在 header 中 <algorithm>
,请参阅 ideone 发布的链接。
关于c++ - 在数学上添加两个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19262193/