當我運行程序時,它崩潰與分段錯誤。另外,當我在代碼塊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