我正在编写一个 ocaml 程序,但我不知道如何查看 int 的特定数字
比如说我们有
let a = 405;;
我希望能够查看第一个数字 4 或第二个数字 0。我怎样才能做到这一点?我想把它变成一个字符串并查看字符,但我觉得应该有另一种方法。
您可以编写一个递归函数来提取数字中的所有数字:
(* 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函数来获取任何数字。
(我会说这是一个一般的编程问题,而不是 OCaml 问题。)
要获得从右侧 0 开始编号的数字 k,请除以(/)
10 的 k 次方,然后取结果 mod 10。
从左边编号数字会使这个问题变得更难。如果你必须这样做,你需要知道数字的位数,你可以从 log base 10 中得到。
转换为字符串(或者,正如 pad 所建议的,转换为数字列表)可能非常好。这基本上按顺序对所有数字进行了所有除法和修改。如果你没有做很多这些转换,它会足够快(恕我直言)。
我正在添加一个新答案,因为@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) [] ;;