【发布时间】:2017-09-10 10:10:00
【问题描述】:
当我运行程序时,它因分段错误而崩溃。此外,当我在 codeblocks IDE 中调试代码时,我也无法调试它。甚至在调试开始之前程序就崩溃了。我无法理解这个问题。任何帮助,将不胜感激。谢谢!!
#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-Baptiste Yunès 的建议和/或一步调试您的代码。顺便提一句。由于调试,我在addStrings()中发现了一个严重的问题。修复此问题后,我注意到堆栈溢出。这意味着,递归的终止不起作用(或者至少递归消耗了太多的堆栈)。我只是在寻找这个的原因...... -
@Scheff...你是对的。程序在调用 main 之前不会崩溃。它为 P1 和 P2 生成一些值,并在一段时间后以分段错误终止。
-
@Scheff,您能否建议您在 addStrings 方法中所做的代码更改