一位網友求助:要計算
“65135168131684301349840650+981603549816879516341638789163516846164=?”
我不知道這個計算的實際意義。網友只求助算法的實現。我在網上搜索了一下,目前網上尚無as3語言的大數計算代碼。
難題是:由於計算機硬件及字長的限制,所能表示的數值範圍是有限的,當我們需要對兩個很大的數進行計算時,會出現溢出錯誤,無法進行計算。
其它語言如C++等,目前研究的成果是用數組存放一個大數的每個位上的數字,數組的首位對應的大數的個位。在計算過程中,要處理進位與退位、負數。
但我根據as3數組的“疏鬆”特點,採用了與其它語言不同的辦法。以下是我創寫大數加法代碼的方法步驟。
工具/原料
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
判斷數位,保證被減數A大於減數B
如果A的數位少於B,就將兩個數及數位個數對調一下。
if (j
vars=A;
A=B;
B=s;
j=k
k=j
}
本例中,AB恰巧需要對換:
用"0"補充數位,使兩數數位相同
這是本方法的創新之處!!
如果兩數數位不同,就用"0"在較小的數最高位前面補充數位,使兩數數位相同。
while (k
B="0"+B;
k++;
}
如果需要補充數位,就一定是給B補充。
分割字符到數組
與其它語言如VC\C++的方法不同的地方是:數的最高在數組首位!!!
var X:Array=[];
var Y:Array=[];
for (var i:int =long; i>0; i--) {
X[i]=A.charAt(i-1);//字符在字符串中最大索引值比個數少1
Y[i]=B.charAt(i-1);
}
數組首位為空,為預留的用於進位的空位。如果無進位,程序會刪除它。
模擬數組對應元素相加,要考慮進位
var R:Array=[];//保存結果
j=0;//個位無進位
for (i=long; i>0; i--) {
varn=Number(X[i])+Number(Y[i])+j;兩數相加再加上進位
R[i]=n%10;//求餘,結果是個位數字
j=int(n/10);//求進位,結果是0或者1
}
if (j>0) {//計算完了,如果有進位,就放在預留的數組的首位。
R[0]=j;
} else {//無進位,就刪除無用的首位元素。
R.shift();
}
輸出查看結果:trace(R.join (""));
你也可以輸出到文本框: Text3.text=R.join ("")
來自實踐的體會 絕對原創的經驗
作者:張志晨
2012.5.15