当我运行程序时,它崩溃与分段错误。另外,当我在代码块IDE中调试代码时,我无法调试它。甚至在调试开始之前程序崩溃。我无法理解这个问题。任何帮助,将不胜感激。谢谢!!Karatsuba整数乘法失败和分段错误
#include <iostream>
#include <math.h>
#include <string>
using namespace std;
// Method to make strings of equal length
int makeEqualLength(string& fnum,string& snum){
int l1 = fnum.length();
int l2 = snum.length();
if(l1>l2){
int d = l1-l2;
while(d>0){
snum = '0' + snum;
d--;
}
return l1;
}
else if(l2>l1){
int d = l2-l1;
while(d>0){
fnum = '0' + fnum;
d--;
}
return l2;
}
else
return l1;
}
int singleDigitMultiplication(string& fnum,string& snum){
return ((fnum[0] -'0')*(snum[0] -'0'));
}
string addStrings(string& s1,string& s2){
int length = makeEqualLength(s1,s2);
int carry = 0;
string result;
for(int i=length-1;i>=0;i--){
int fd = s1[i]-'0';
int sd = s2[i]-'0';
int sum = (fd+sd+carry)%10+'0';
carry = (fd+sd+carry)/10;
result = (char)sum + result;
}
result = (char)carry + result;
return result;
}
long int multiplyByKaratsubaMethod(string fnum,string snum){
int length = makeEqualLength(fnum,snum);
if(length==0) return 0;
if(length==1) return singleDigitMultiplication(fnum,snum);
int fh = length/2;
int sh = length - fh;
string Xl = fnum.substr(0,fh);
string Xr = fnum.substr(fh,sh);
string Yl = snum.substr(0,fh);
string Yr = snum.substr(fh,sh);
long int P1 = multiplyByKaratsubaMethod(Xl,Yl);
long int P3 = multiplyByKaratsubaMethod(Xr,Yr);
long int P2 = multiplyByKaratsubaMethod(addStrings(Xl,Xr),addStrings(Yl,Yr)) - P1-P3;
return (P1*pow(10,length) + P2*pow(10,length/2) + P3);
}
int main()
{
string firstNum = "62";
string secondNum = "465";
long int result = multiplyByKaratsubaMethod(firstNum,secondNum);
cout << result << endl;
return 0;
}
通过添加至少观察调用'CERR << “(”<< fnum <<“,”<< snum <<“)”<< endl;'在函数的开头,您将看到问题(在某个点处无限递归)。 –
@ RK21我不确定程序在进入main()之前崩溃。我也没有看到任何可能会引起怀疑的代码,我也不能在Visual Studio中调试它时验证这一点。请考虑Jean-BaptisteYunès的建议和/或单步调试您的代码。顺便说一句。由于调试,我在addStrings()中发现了一个严重的问题。解决这个问题后,我注意到堆栈溢出。这意味着,递归终止不起作用(或者至少递归消耗太多堆栈)。我只是在寻找这个原因...... – Scheff
@Scheff ......你是对的。在调用main之前,程序不会崩溃。它为P1和P2产生一些值,并在一段时间后出现分段故障。 – RK21