應網友的求助,在我完成了大數加法的演算法之後,我自然想到:怎樣計算大數的減法呢?雖然思路和大數加數異曲同工,卻另有微妙不同。以下是我編寫的大數減法程式碼的方法步驟。
工具/原料
win7+flash cs5.5+as3
步驟/方法
將數值轉為字串
在flash程式中,通過在文字框中的輸入來獲取大數。這時,大數已經變成了字串。只不過它的末尾多了一個不可見的空字元。所以在求長度時要減去1。
var A:String=Text1.text
var B:String=Text2.text
var j:int=A.length-1;
var k:int=B.length-1;
var long:int=j
var sign:String="";//處理結果為負數
判斷數位,保證被減數A大於減數B
如果A的數位少於B,就將兩個數及數位個數對調一下。
if (j
vars=A;
A=B;
B=s;
j=k
k=j
sign="-"//結果為負
}else if(Number(A)
s=A;//如果數位相同,要保證A是大數
A=B;
B=s;
s=j;
j=k;
k=s;
sign="-"//結果為負
}
本例中,AB數位相同,並且恰巧需要對換:
用"0"補充數位,使兩數數位相同
這是本方法的創新之處!!
如果兩數數位不同,就用"0"在較小的數最高位前面補充數位,使兩數數位相同。
while (k
B="0"+B;
k++;
}
如果需要補充數位,就一定是給B補充。
分割字元到陣列
與其它語言如VB、C++不同的地方是:數的最高在陣列首位!!!
var X:Array=[];
var Y:Array=[];
for (var i:int =long; i>0; i--) {
X[i-1]=A.charAt(i-1);//字元在字串中最大索引值比個數少1
Y[i-1]=B.charAt(i-1);
}
與加法不同的是,減法陣列首位不預留空位,因為減法沒進位,但有退位。
模擬陣列對應元素相減,要考慮退位
var R:Array=[];
for (i=long; i>0; i--) {
if(Number(X[i-1])
if(R[i-2]==undefined) {
R[i-2]=0;
}
R[i-2]-=1;//從上位借1,
R[i-1]=Number(X[i-1])+10-Number(Y[i-1]);//借1當10
}else {
R[i-1]=Number(X[i-1])-Number(Y[i-1]);//夠減直接減
}
}
得到結果如下:
去掉最高位的"0"
s=true;//去掉最高位的"0"
while (s) {
if(R[0]==0) {//如果最高位有0
R.shift();
}else {
s=false;//沒有0,退出程式
}
處理結果為負數的情況
if (sign=="-") {
R.unshift("-");
}
輸出結果
trace(R.join (""));
你也可以輸出到文字框。
Text3.text=R.join ("")
來自實踐的體會 絕對原創的經驗
作者:張志晨
2012.5.16