2

我正在编写一个 ocaml 程序,但我不知道如何查看 int 的特定数字

比如说我们有

let a = 405;;

我希望能够查看第一个数字 4 或第二个数字 0。我怎样才能做到这一点?我想把它变成一个字符串并查看字符,但我觉得应该有另一种方法。

4

3 回答 3

5

您可以编写一个递归函数来提取数字中的所有数字:

(* Assuming n is a non-negative number *)
let digits n =
    let rec loop n acc =
        if n = 0 then acc
        else loop (n/10) (n mod 10::acc) in
    match n with
    | 0 -> [0]
    | _ -> loop n []

一旦你有一个数字列表

# digits 405;;
- : int list = [4; 0; 5]

您可以使用一些List函数来获取任何数字。

于 2013-01-14T23:30:33.793 回答
4

(我会说这是一个一般的编程问题,而不是 OCaml 问题。)

要获得从右侧 0 开始编号的数字 k,请除以(/)10 的 k 次方,然后取结果 mod 10。

从左边编号数字会使这个问题变得更难。如果你必须这样做,你需要知道数字的位数,你可以从 log base 10 中得到。

转换为字符串(或者,正如 pad 所建议的,转换为数字列表)可能非常好。这基本上按顺序对所有数字进行了所有除法和修改。如果你没有做很多这些转换,它会足够快(恕我直言)。

于 2013-01-14T23:30:42.130 回答
0

我正在添加一个新答案,因为@pad 的解决方案丢弃了前导“0”。我提出了一个保留所有前导零的解决方案,例如,如果您想解析电话号码,这很有用。

let digits s = 
    let rec aux n nb_chars accu = match n with
        | 0 -> (if nb_chars=0 then accu else (aux 0 (nb_chars-1) (0::accu)))
        | _ -> aux (n/10) (nb_chars - 1) (n mod 10::accu)
        in
    let rec init_list = function
        | 0 -> []
        | n -> 0 :: (init_list (n-1))
        in
    if s=(String.make (String.length s) '0')
    then (init_list (String.length s))
    else aux (int_of_string s) (String.length s) [] ;;
于 2019-06-25T01:10:30.497 回答