我正试图在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
中。
答案 0 :(得分:2)
在整数列表上进行数学运算会引起头疼,所以首先要弄清楚如何定义两个列表的乘法。我将假设它们将始终是整数并定义函数如下。
let mult_int_lists a b =
list_of_int ((int_of_list a) * (int_of_list b));;
该函数采用两个列表,将它们转换为整数,将它们相乘,然后将该结果转换回列表。那么我们如何定义list_of_int
和int_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
类型。希望它有所帮助!