アイデアは、operator *
数値の10進値を表す2つの文字列を乗算できるように、をオーバーロードすることです。演算子はより大きなクラスの一部ですが、それは重要ではありません。アルゴリズムは小学校と同じです:)
これが私のコードです:
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の場合、3584ではなく4854を返します。
何が問題なのか考えてみませんか?
operator
s+
と=
はすでにクラスに対してオーバーロードされており、Bignumber
正常に動作します。