想法是重載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