ocaml смотрит на конкретную цифру int

Я пишу программу ocaml и не могу понять, как смотреть на определенные цифры int

так скажем, например, у нас есть

let a = 405;;

Я хочу иметь возможность смотреть на первую цифру, 4, или на вторую, 0. Как я могу это сделать? Я думал превратить его в строку и посмотреть на символы, но мне кажется, что должен быть другой способ сделать это.


person Charles Haro    schedule 14.01.2013    source источник


Ответы (3)


Вы можете написать рекурсивную функцию для извлечения всех цифр из числа:

(* 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.

person pad    schedule 14.01.2013

(Я бы сказал, что это общая проблема программирования, а не проблема OCaml.)

Чтобы получить цифру k, пронумерованную от 0 справа, вы делите (/) на k-ю степень числа 10, затем берете результат по модулю 10.

Нумерация цифр слева усложняет эту задачу. Если вам нужно это сделать, вам нужно знать количество цифр в числе, которое вы можете получить из логарифмической базы 10.

Может быть совершенно нормально преобразовать в строку (или, как предлагает блокнот, в список цифр). Это в основном делает все деления и моды для всех цифр по порядку. Если вы не делаете много этих преобразований, это будет достаточно быстро (ИМХО).

person Jeffrey Scofield    schedule 14.01.2013

Я добавляю новый ответ, потому что решение @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) [] ;;
person Be Chiller Too    schedule 25.06.2019