在数组列表OCaml中乘以int

时间:2016-01-14 16:46:59

标签: arrays ocaml

我正试图在OCaml中解决这个问题:

我有两个可变大小的数组,如DECLARE @Cust_NoHolds TABLE(ID INT, IDs VARCHAR(100)) INSERT INTO @Cust_NoHolds SELECT '0', '1234' INSERT INTO @Cust_NoHolds SELECT '1', '1225' INSERT INTO @Cust_NoHolds SELECT '2', '1256' INSERT INTO @Cust_NoHolds SELECT '3', '1287' INSERT INTO @Cust_NoHolds SELECT '4', '1212' INSERT INTO @Cust_NoHolds SELECT '5', '1290' INSERT INTO @Cust_NoHolds SELECT '6', '1350' INSERT INTO @Cust_NoHolds SELECT '7', '1334' INSERT INTO @Cust_NoHolds SELECT '8', '1631' INSERT INTO @Cust_NoHolds SELECT '9', '1953' DECLARE @I INT DECLARE @J INT SET @I = 0 SET @J = (SELECT COUNT(IDs) AS Cust_NoHolds FROM @Cust_NoHolds) WHILE @I < @J BEGIN SELECT * FROM @Cust_NoHolds WHERE ID = @I /*Delete Statement DELETE custodian_history FROM custodian_history CH WHERE CH.Custodian_Id IN (SELECT IDs FROM @Cust_NoHolds WHERE ID = @I) */ SET @I = @I + 1 END [1;4;5],它们代表两个整数:145和323。

我想将这两个数字[3;2;3]相乘。结果是145 * 323。我希望将结果放在数组46835中。

2 个答案:

答案 0 :(得分:2)

在整数列表上进行数学运算会引起头疼,所以首先要弄清楚如何定义两个列表的乘法。我将假设它们将始终是整数并定义函数如下。

let mult_int_lists a b =
    list_of_int ((int_of_list a) * (int_of_list b));;

该函数采用两个列表,将它们转换为整数,将它们相乘,然后将该结果转换回列表。那么我们如何定义list_of_intint_of_list?在查看我的代码之前,我会挑战你自己解决这个问题。

let int_of_list l =
    let rec exp x = if x = 0 then 1 else 10 * (exp (x - 1)) in
    List.fold_left (+) 0 (List.mapi (fun i x -> x * (exp i)) (List.rev l))

将列表转换为int要求我们反转列表,将每个数字乘以10 ^ i,然后将所有这些数字相加。我使用List.rev按顺序将列表从最小到最大。然后List.mapi获取每个值并将其转换为正确的十位。最后,List.fold_left获取值列表并将它们添加到单个整数值中。

let list_of_int i =
    let rec aux i =
        if i = 0 then [] else (i mod 10) :: aux (i / 10) in
    List.rev (aux i)

要将int转换为列表,我们需要除以10得到每个十位,并且只保留余数。为了获得余数,我们可以使用模数(mod)。然后我们可以继续循环,直到数字等于零,这是我们返回列表值的时候。它将是向后的,这就是使用List.rev的原因。

答案 1 :(得分:1)

您需要做的第一件事是将表示一个整数的整数列表转换为整数本身。使用整数10的基数表示来创建这样的函数。一个简单的例子是整数145 : 100 * 1 + 10 * 4 + 5。所以第一个函数看起来像:

   let list_to_int l =
  List.fold_left (fun (acc,n) x ->
     let m = 10. ** (n -. 1.) in
     acc +. x *. m, n -. 1.
    ) (0.0, float_of_int (List.length l)) l
;;

我使用函数fold_left来累积整数值,我也使用函数pow(记住基数10)。

您需要的第二个函数是从整数中获取数字。你将拥有这样的功能:

        val digits : int -> int list = <fun>

使用此功能(将其写为exercice!),您将获得最终结果。示例:

digits 46835;;
- : int list = [4; 6; 8; 3; 5]

最后,您可以使用以下函数进行乘法运算:

let mul l1 l2 =
  let (x1,_) = list_to_int (List.map float_of_int l1)in 
  let (x2,_) = list_to_int (List.map float_of_int l2) in 
  digits ((int_of_float x1) * (int_of_float x2));;

您需要将整数列表转换为float,因为函数pow适用于float类型。希望它有所帮助!