如何用c++;? < P>我尝试用C++解决这个方法,但是我不能避免从“代码> int >代码>长long int 或双的更改类型的整数溢出。Python不会溢出,所以我的代码如下所示

如何用c++;? < P>我尝试用C++解决这个方法,但是我不能避免从“代码> int >代码>长long int 或双的更改类型的整数溢出。Python不会溢出,所以我的代码如下所示,c++,algorithm,integer,C++,Algorithm,Integer,给定两个表示为字符串的非负整数num1和num2,返回num1和num2的乘积,也表示为字符串。 Python可以工作: 类解决方案: def multiply(self,num1:str,num2:str)->str: n=len(num1)#假设n>=m m=len(num2) 如果n1;0 | 2,1 | 1,2 | 0->2,依此类推。您可以通过以下方式生成这些对: for(size_t i = 0, max = std::max(num1.length(), num2.length);

给定两个表示为字符串的非负整数num1和num2,返回num1和num2的乘积,也表示为字符串。

Python可以工作:

类解决方案:
def multiply(self,num1:str,num2:str)->str:
n=len(num1)#假设n>=m
m=len(num2)
如果n
C++失败:

字符串乘法(字符串num1,字符串num2){
int n=num1.size();
int m=num2.size();
if(n对于(int i=1;i您走的路不对。想象一下,您将如何手动完成此操作:

abc*def
-------
   xxxx
  xxxx0
 xxxx00
-------
你也只需要添加个位数,不是吗?只有那些意义相同的数字——可能考虑一些进位

您可能更愿意在代码中复制相同的内容。以这种方式产生溢出的可能性要小得多(我假设将结果乘以一个整数——建议使用无符号类型——是可以接受的;否则,您必须再次构建
std::string
).你独立计算的符号,就像你用手计算一样

不过,手工乘法的一个不同点是:手工乘法是将一个数字与每个数字相乘,从而生成相当大的中间数 但更有效的方法是识别那些乘法结果具有相同意义的数字对

这些将是
0 | 0->0;0 | 1,1 | 0->1;0 | 2,1 | 1,2 | 0->2
,依此类推。您可以通过以下方式生成这些对:

for(size_t i = 0, max = std::max(num1.length(), num2.length); i < max; ++i)
{
    for(size_t j = 0; j < i; ++j)
    {
        if(j < num1.length() && i - j < num2.length())
        {
            // iterate backwards for easy carry handling
            size_t idx1 = num1.length() - j;
            size_t idx2 = num2.length() - (i - j);
            // multiply characters at num1[idx1] and num2[idx2] and add result to sum
        }
    }
    // add carry
    // calculate last digit and  a p p e n d  to a result string
    // update carry
}
// append '-' sign, if result is negative
std::reverse(result.begin(), result.end());
for(size\u t i=0,max=std::max(num1.length(),num2.length);i
以相反顺序构建字符串更有效,因为您不需要一直移动后续字符。(未测试的代码,如果发现错误,请自行修复)

循环在我的首选变体中;如果您对另一种类型感觉更好,请随意更改;请注意,对于有符号类型,如果您尝试(unsigned i=n;n>=0;--i/*溢出到UINT_MAX*/)
,您可以生成无止境的循环


旁注:您应该通过引用接受输入字符串(
std::string const&num1,std::string const&num2
),这避免了通过值接受产生不必要的副本。

Python具有任意精度数字(即,它们的范围可以动态扩展,而不是溢出)C++不以它的数值类型工作。你必须使用你自己的任意精度类型(从库中自己制作或自己制作)。,或重新考虑乘法算法以避免溢出情况。请显示一个示例,包括您的代码应该执行的操作、输入、预期输出和实际输出,而不使用外部链接代码应该执行的操作是什么?我认为您做错了。请将答案保存在
字符串中,而不是
long long int
。您可以正在使用的是
pow(10,j)
,这也应该被字符串连接所取代。问题语句本身说:您不能使用任何内置的BigInteger库或直接将输入转换为整数。使用
long-long-int
无法达到目的。@Enlico-Main无论如何都是微不足道的:
int-Main(){std::cout虽然我不会使用单个字符,但LSD中的4(32位)或9(64位)组:
以代码的形式复制[手工乘法]
是一种方法!对于多达40k的初级产品来说,这已经够乏味了,足以让我思考Toom Cook了。(没有投票权,因为我不太相信(size_t j=num2.length()的
),last=j-num1.length()+i;j-->last;)
匹配我手动添加相同重要性的单个数字[…]的方式。)GryBeLID使用组使代码更复杂,这就是为什么我不依赖。一个必须考虑在乘法和总结的同时溢出,所以必须仔细选择组大小和使用整数类型。问题越长,数字就越长。(不知道我写的时候想的是什么…)。
abc*def
-------
   xxxx
  xxxx0
 xxxx00
-------
for(size_t i = 0, max = std::max(num1.length(), num2.length); i < max; ++i)
{
    for(size_t j = 0; j < i; ++j)
    {
        if(j < num1.length() && i - j < num2.length())
        {
            // iterate backwards for easy carry handling
            size_t idx1 = num1.length() - j;
            size_t idx2 = num2.length() - (i - j);
            // multiply characters at num1[idx1] and num2[idx2] and add result to sum
        }
    }
    // add carry
    // calculate last digit and  a p p e n d  to a result string
    // update carry
}
// append '-' sign, if result is negative
std::reverse(result.begin(), result.end());