問題是這樣的:從1到100000中任意拿掉兩個數(shù)字,把剩下99998個數(shù)的順序打亂并且放到數(shù)組中,要求只掃描一遍,把這個兩個數(shù)找出來,可以使用最多不超過5個局部變量,不能使用數(shù)組變量并且不能改變數(shù)組的值。
開始老擔(dān)心溢出問題,最簡單的方法不敢用,老想另辟蹊徑。最后發(fā)現(xiàn)擔(dān)心是多余的,這里需要用到的數(shù)只是稍微超過32位而已,大多數(shù)高級語言都能很輕松的處理64位大整數(shù),連javascript也可以處理54位的大整數(shù)而不丟失精度,遠(yuǎn)遠(yuǎn)超過了這個問題的規(guī)模。
這里特地把計算范圍擴大了5倍來檢驗溢出問題。規(guī)模再大的時候我的IE計算時間超過5秒開始要警告了。為了代碼簡潔,打亂次序使用了效率很低的sort方法,大量的時間都消耗在這一步。把排序參數(shù)調(diào)整為0.8(而不是0.5)主要是為了減少排序計算量。
開始老擔(dān)心溢出問題,最簡單的方法不敢用,老想另辟蹊徑。最后發(fā)現(xiàn)擔(dān)心是多余的,這里需要用到的數(shù)只是稍微超過32位而已,大多數(shù)高級語言都能很輕松的處理64位大整數(shù),連javascript也可以處理54位的大整數(shù)而不丟失精度,遠(yuǎn)遠(yuǎn)超過了這個問題的規(guī)模。
這里特地把計算范圍擴大了5倍來檢驗溢出問題。規(guī)模再大的時候我的IE計算時間超過5秒開始要警告了。為了代碼簡潔,打亂次序使用了效率很低的sort方法,大量的時間都消耗在這一步。把排序參數(shù)調(diào)整為0.8(而不是0.5)主要是為了減少排序計算量。
<HTML>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var n=500000;//n是常數(shù),不算臨時變量。
var ar=[];//這是輸入數(shù)據(jù),不算臨時變量
for(var i=0;i<n;i++){
ar.push(i+1)
}
//i是生成輸入數(shù)據(jù)使用的,不算臨時變量
//隨機抽取掉兩個數(shù)
document.write("抽掉的第1個數(shù)是:"+ar.splice(Math.floor(Math.random()*ar.length),1))
document.write("<br>抽掉的第2個數(shù)是:"+ar.splice(Math.floor(Math.random()*ar.length),1))
//打亂順序
ar.sort(function(){return Math.random()-.8})
//使用了3個臨時變量
var t1=0,t2=0,t3;
for(t3=ar.length-1;t3>=0;t3--){
t1=t1+ar[t3];
t2=t2+(t3+1)*(t3+1)-ar[t3]*ar[t3];
}
t2=t2+n*n*2-n*2+1;
document.write("<br>計算得到兩個數(shù)是:<br>"+(((n+1)*n/2-t1)+Math.sqrt(2*(t2)-((n+1)*n/2-t1)*((n+1)*n/2-t1)))/2+"<br>"+(((n+1)*n/2-t1)-Math.sqrt(2*(t2)-((n+1)*n/2-t1)*((n+1)*n/2-t1)))/2)
//-->
</SCRIPT>
</BODY>
</HTML>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var n=500000;//n是常數(shù),不算臨時變量。
var ar=[];//這是輸入數(shù)據(jù),不算臨時變量
for(var i=0;i<n;i++){
ar.push(i+1)
}
//i是生成輸入數(shù)據(jù)使用的,不算臨時變量
//隨機抽取掉兩個數(shù)
document.write("抽掉的第1個數(shù)是:"+ar.splice(Math.floor(Math.random()*ar.length),1))
document.write("<br>抽掉的第2個數(shù)是:"+ar.splice(Math.floor(Math.random()*ar.length),1))
//打亂順序
ar.sort(function(){return Math.random()-.8})
//使用了3個臨時變量
var t1=0,t2=0,t3;
for(t3=ar.length-1;t3>=0;t3--){
t1=t1+ar[t3];
t2=t2+(t3+1)*(t3+1)-ar[t3]*ar[t3];
}
t2=t2+n*n*2-n*2+1;
document.write("<br>計算得到兩個數(shù)是:<br>"+(((n+1)*n/2-t1)+Math.sqrt(2*(t2)-((n+1)*n/2-t1)*((n+1)*n/2-t1)))/2+"<br>"+(((n+1)*n/2-t1)-Math.sqrt(2*(t2)-((n+1)*n/2-t1)*((n+1)*n/2-t1)))/2)
//-->
</SCRIPT>
</BODY>
</HTML>
posted on 2010-08-02 16:49 emu 閱讀(2031) 評論(3) 編輯 收藏 所屬分類: DHTML和JAVASCRIPT 技術(shù) 、google編程大賽模擬題及入圍賽真題