簡體   English   中英

SML:用於大整數表示的模塊

[英]SML : module for large integer representation

這是一道作業題。 在 SML 中,整數大小有一個限制,即 Int.maxInt,所以我必須設計一個可以表示大整數以及執行加法、乘法等操作的包。現在,顯而易見的選擇是拆分成一個列表或數組,其中每個元素都有一個可接受大小的整數。 但是如果定義一個函數假設,

IntToLargeInt(x, base) = (x mod base) :: IntToLargeInt(x div base , base)

現在,對於小於最大大小的整數,它確實會轉換為列表中的另一個基數。 但是對於大整數,在它甚至可以將其拆分之前,它會引發溢出異常。 所以,任何關於如何直接從函數參數解析的提示,比如 stdin 流或類似的東西。 基本上,任何可以幫助我使函數適用於大整數的東西。

我應該先使用 IntInf 之類的類型來存儲它,然后再轉換為另一個基數嗎?

或者,如果我走錯了方向,一些關於從哪里開始的提示會很好。

如果您擔心效率,使用IntInf.fromString可能是有意義的。 但是——如果您真的擔心效率,那么您將只使用IntInf來處理所有事情,而不是嘗試自己實現大量庫。

一種更幼稚的方法是將一串數字分解為一個反轉的數字列表,然后將此數字列表轉換為您的 int 列表之一。 您可以盡快執行此操作:

1) 將單個數字轉換為 LargeInts

2) 將你的 LargeInts 乘以 10

3) 添加大整數

為了了解它是如何工作的,這里是一個將字符串轉換為普通整數的函數的實現:

fun digitToInt d = Char.ord d - Char.ord #"0";

fun digitsToInt [] = 0
|   digitsToInt (d::ds) = digitToInt d + 10 * digitsToInt ds;

請注意,上面的+*需要由您的自定義函數替換。 以上適用於最低有效數字在列表中排在第一位的數字,唉,這與數字表示的標准方式相反。 我們可以使用內置函數rev來解決這個問題:

val stringToInt = digitsToInt o rev o explode;

(這完全等同於

fun stringToInt s = digitsToInt(rev(explode s));

但稍微更具可讀性。)

例如,

- stringToInt "12345";
val it = 12345 : int

不是很令人興奮,但您應該能夠修改此方法以匹配您的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM