想法是重载operator *
,以便它可以乘以代表数字十进制值的两个字符串。操作员是一个更大的班级的一部分,但这并不重要。该算法是一样的小学:)代表数字十进制值的2个字符串的C++乘法
这里是我的代码:
Bignumber operator* (Bignumber x, Bignumber y){
int i, j, transfer=0, tmp, s1, s2, k;
char add[1];
string sol;
string a, b;
Bignumber v1, v2;
a=x.GetValue();
b=y.GetValue();
a.insert(0,"0");
b.insert(0,"0");
for(i=a.length()-1; i>=0; i--){
s1 = (int) a[i]-48;
for(k=a.length()-i-1; k >0 ; k--){
sol+="0";
}
for(j=b.length()-1; j >=0; j--){
s2=(int) b[j]-48;
tmp=s1*s2+transfer;
if(tmp >= 10){
transfer=tmp/10;
tmp=tmp-(10*transfer);
}
itoa(tmp, add, 10);
sol.insert(0, add);
}
v1=sol;
v2=v1+v2;
sol.erase(0);
transfer=0;
}
return v2;
}
也能正常工作的大部分时间,但对于一些随机值它不正常工作。例如对于128 * 28,它返回4854而不是3584.
任何想法可能是什么问题?
operator
s +
和=
已经超载为类Bignumber
,他们工作正常。
你为什么使用字符串表示? “Bignumber”类最有可能具有在某些基数中暴露“数字”的表示(例如,65536)。 – Vlad 2011-04-03 16:34:35
多数民众赞成那不是问题在这里..我需要找出为什么它不工作:) – boone 2011-04-03 16:39:28
prenos没有定义,tmp使用时未经初始化,这是一个愚蠢的做法 – 2011-04-03 16:51:01