在上個月的挑戰中,我必須避免造成溢出錯誤可能導致額外複雜情況的情況。 事實上,基於 Miller-Rabin 的模冪演算法是質數編寫例程是為了避免這個問題。 無論使用何種程式語言,您都不可避免地會遇到此問題。
當您嘗試執行所需位數多於可用於表示結果的位數的操作時,就會發生溢位錯誤。 在處理大整數時,這種情況經常(但並非唯一)發生。 例如,請嘗試以下範例:
//Example 1
x = 9007199254740992;
For(i=1,i<=10,i++,Print(x+i));
x = 9007199254740992;
For(i=1,i<=10,i++,Print(x-i));
//Example 2
n1 = 9007199254740999;
n2 = 1;
Print(n1-n2);
2 53是最大的整數聯合管理計劃可以代表溢出發生之前。 這是浮點表示的一個很好的解釋(JMP 中的所有數字均為浮點數)。 對於本月的挑戰,我希望看到您想出一些加法和減法的方法,這些方法會溢出 JMP 的整數表示。 建立兩個函數
- 減大( n1 , n2 ) 在哪裡n1和n2都是文字形式的整數(正數、負數或 0)。 傳回文字形式的值。
- 加大( n1 ,< n2 >) 哪裡
n1 – 文字形式的整數,或者,如果n2為空,文字形式的整數列表(正數、負數或 0)。
n2 – 文字形式的整數
傳回文字形式的值。
例子
減大(“9007199254740999”,“9007199254740998”)返回“1”
加大(“9007199254740992”,“7”)返回“9007199254740999”
加大({“9007199254740999”,”-1”,”11”}) 返回“9007199254741009”
評分
- 一個版本5分加大它可以 1) 在 30 秒內將兩個最多 1000 位數字相加,以及 2) 在 30 秒內找到最多包含 100、100 位數字的列表的總和。 第 1) 部分將使用 10 組不同的數字進行測試。 每個數字中的位數不一定相同。 所有提交的內容將使用同一套 10 個。
- 額外加分3分減大,它必須在 30 秒內計算 (x – y),其中 x 和 y 是最多 1000 位數字。 將使用十組不同的數字。 每個數字的位數不一定相同。 所有提交的內容將使用同一套 10 個。
- 3 獎勵積分加大能正確添加最大(位數)的提交n1和n2相同長度,5 秒內完成。 (2分2分ND , 1 代表 3 RD )
- 3 獎勵積分加大提交能夠在 5 秒內正確添加最多 1000 位數字的作品(2 分 2 分) ND , 3 分 1 分RD )。
- 如果提交的速度與 JMP 工作人員提交的速度相同或更快,則每項加分 3 分。
提交截止日期為美國東部時間 6 月 15 日星期一晚上 11:59。 祝你好運!
這可能值得澄清,因為這有點令人困惑。 兩個函數(並且兩種情況都為加大)應該能夠處理不同長度和符號的數字。 我會測試一下。 在確定獎勵速度和大小點時,我將使用相同長度的數字。
大學教師
我昨晚又讀了一遍你的挑戰描述,我認為你對要求的解釋很清楚。請隨意忽略我的詢問。對於那個很抱歉!
-戴夫
回應我的詢問 - 我剛剛讀過你的第三個例子 - 這表明(我)我們不能假設 n1 列表中的所有數字都具有相同的位數。也, (二) n1 列表可能包含負數。想必那時(三)對於兩個數字 n1 和 n2 的情況,其中一個或兩個可能為負數?
也許你可以澄清我提到的三點。 謝謝。
對於我們添加數字列表的情況,我們是否可以假設每個數字的長度相同,或者這是我們需要測試的東西? (即我們需要處理一般情況還是只處理您描述的測試場景?)