C++ 将一个大整数与一个数字相乘。什么';我的密码怎么了?
我想在斯波吉解决这个问题。该程序应该能够计算100个数字的阶乘 为了解决这个问题,我应该能够将大数相乘。为了实现这一点,我将数字写成字符串,并应用小学乘法算法。我的代码中有一个名为multiply1的助手函数,它将一个大数字与一个数字相乘。代码如下:C++ 将一个大整数与一个数字相乘。什么';我的密码怎么了?,c++,c++14,C++,C++14,我想在斯波吉解决这个问题。该程序应该能够计算100个数字的阶乘 为了解决这个问题,我应该能够将大数相乘。为了实现这一点,我将数字写成字符串,并应用小学乘法算法。我的代码中有一个名为multiply1的助手函数,它将一个大数字与一个数字相乘。代码如下: #include <iostream> #include <string> using namespace std; string multiply1(string sx, string sy) { string r
#include <iostream>
#include <string>
using namespace std;
string multiply1(string sx, string sy)
{
string res(sx.size() + 1, 'x');
int rem = 0;
for (int i = sx.size() - 1; i >= 1; i--)
{
int ix = sx[i] - '0';
res[i + 1] = ((ix*(sy[0] - '0') + rem) % 10);
res.replace(i + 1, i + 2, to_string((ix*(sy[0] - '0') + rem) % 10));
rem = (ix - (ix % 10)) / 10;
}
int ix = sx[0] - '0';
string last = to_string(ix*(sy[0] - '0') + rem);
if (last.size() == 1)
{
res[1] = last[0]; string res2;
for (int i = 1; i < res.size(); i++)
{
res2[i - 1] = res[i];
}
return res2;
}
else
{
res[1] = last[1];
res[0] = last[0];
return res;
}
return res;
}
int main()
{
cout << multiply1("155557452", "3");
return 0;
}
“调试断言失败”是什么意思?如何修复此错误?当您使用Microsoft Visual Studio调试在调试模式下编译的程序时,会在代码中添加大量检查,以阻止程序中未定义或设置不正确的代码。“Debug Assertion Failed”是检测到调试运行库明确测试的这些常见错误之一时得到的一般消息 您需要关心的实际消息在错误中有几行: 告诉您正在尝试访问字符串边界之外的内容 我最好的猜测是可疑行是这段代码:
if (last.size() == 1)
{
res[1] = last[0]; string res2;
for (int i = 1; i < res.size(); i++)
{
res2[i - 1] = res[i];
}
return res2;
}
这将修复此不良行为的特定实例
我还建议您扫描代码的其余部分,查找类似这样的错误
还有一件事。看起来您正在编写自己的任意精度整数算术。如果这是学校作业的一部分(或者仅仅是你试图自学的东西),那么继续努力,使用我在这里提供的建议
但是,如果这是一个业余项目或专业项目,我建议您使用一个完善的任意精度算术库,而不是试图重新发明轮子。我建议使用或GMP,这取决于您作为开发人员的需要。当您使用Microsoft Visual Studio调试在调试模式下编译的程序时,会在代码中添加大量检查,以防止程序中出现未定义或未正确设置的代码。“Debug Assertion Failed”是检测到调试运行库明确测试的这些常见错误之一时得到的一般消息 您需要关心的实际消息在错误中有几行: 告诉您正在尝试访问字符串边界之外的内容 我最好的猜测是可疑行是这段代码:
if (last.size() == 1)
{
res[1] = last[0]; string res2;
for (int i = 1; i < res.size(); i++)
{
res2[i - 1] = res[i];
}
return res2;
}
这将修复此不良行为的特定实例
我还建议您扫描代码的其余部分,查找类似这样的错误
还有一件事。看起来您正在编写自己的任意精度整数算术。如果这是学校作业的一部分(或者仅仅是你试图自学的东西),那么继续努力,使用我在这里提供的建议
但是,如果这是一个业余项目或专业项目,我建议您使用一个完善的任意精度算术库,而不是试图重新发明轮子。我建议使用或GMP,这取决于您作为开发人员的需要。听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:对不起,“字符串下标超出范围”是否已经告诉您出了什么问题?您是否知道类型unsigned long long int最多可以处理18446744073709551615(2power64-1)的值?@ravenpoint 100!是9332621544394152681699238856266700490715968264316214685992963895217599322991608944146397615651828625367920827223758251185210916864000000000000000000。当我执行你的程序时没有错误,包括在valgrind下,它只是在结尾处写入一个空字符串。听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:对不起,“字符串下标超出范围”是否已经告诉您出了什么问题?您是否知道类型unsigned long long int最多可以处理18446744073709551615(2power64-1)的值?@ravenpoint 100!是9332621544394152681699238856266700490715968264316214685992963895217599322991608944146397615651828625367920827223758251185210916864000000000000000000000000。当我执行你的程序时没有错误,包括在valgrind下,它只在末尾写一个空字符串谢谢!但现在我只是得到了一个错误的答案。我想我会使用向量代替上面建议的字符串,并检查我的逻辑。谢谢!但现在我只是得到了一个错误的答案。我想我会像上面建议的那样使用向量而不是字符串,并检查我的逻辑。
if (last.size() == 1)
{
res[1] = last[0]; string res2;
for (int i = 1; i < res.size(); i++)
{
res2[i - 1] = res[i];
}
return res2;
}
if (last.size() == 1)
{
res[1] = last[0]; string res2;
res2.resize(res.size() - 1);
for (int i = 1; i < res.size(); i++)
{
res2[i - 1] = res[i];
}
return res2;
}