给出一个数字列表和一个数字k,返回列表中的任何两个数字是否加起来为k。
例如,给定[10,15,3,7]且k为17,则由于10 + 7为17,因此返回true。
程序必须提示用户输入。
程序必须接受列表作为逗号分隔值的集合。
所有值均应为整数。
输入列表的长度可以在1到42之间。
我做了什么
我已经能够输入整数列表作为列表,并用逗号分隔,但是当2个数字加到k时我无法返回true
toList :: String -> [Integer]
toList input = read ("[" ++ input ++ "]")
main = do
putStrLn "Enter a list of numbers (separated by comma):"
input <- getLine
print $ k (toList input)
答案 0 :(得分:1)
有以下方法。
1)创建一个列表pf对,它们都是[[10,10),(10,15),..,(15,10),(15,3)..]的组合。 现在,您可以在此列表上使用简单的 any 函数来检查是否有任何一对加起来等于给定的数字。
getCoupleList :: [a]->[(a,a)]
getCoupleList [] = []
getCoupleList [x] = []
getCoupleList (x:xs) = map (\y->(x,y)) xs ++ getCoupleList xs
getSumOfCoupleList :: Num a => [(a,a)]->[a]
getSumOfCoupleList xs = map (\x -> fst x + snd x) xs
isSum :: [Int]->Int->Bool
isSum xs k = any (==k) $ (getSumOfCoupleList.getCoupleList) xs
或直接检查wuthout getSumOfCoupleList
isSum xs k = any (\(a,b)-> a + b == k) $ (getSumOfCoupleList.getCoupleList) xs
如果您选择创建情侣列表并找到不需要的总和。我们可以通过简单的更改直接获得总和列表。
getSumList :: Num a=>[a]->[a]
getSumList [] = []
getSumList [x] = []
getSumList (x:xs) = map (+x) xs ++ getSumList xs
isSum1 :: [Int]->Int->Bool
isSum1 xs k = any (==k) $ getSumList xs
2)通过从17中减去每个元素,从给定列表中创建另一个列表。现在只需检查第二个列表中是否存在第一个列表中的任何数字。
isSum2 :: [Int]->Int->Bool
isSum2 xs k = let newList = map (k-) xs
intersectList = xs `intersect` newList
in not (null intersectList)
答案 1 :(得分:0)
这是一种幼稚的方法,未经优化,仅显示示例。
toList :: String -> [Integer]
toList input = read ("[" ++ input ++ "]")
check :: Integer -> [Integer] -> Bool
check k (x:xs) = if ((k-x) `elem` xs)
then True
else (check k xs)
check k x = False
main = do
let k = 12
putStrLn "Enter a list of numbers (separated by comma):"
input <- getLine
print $ (check k (toList input))
答案 2 :(得分:0)
最近在一次采访中有人问我同样的问题,这是我的答案之一
import util
arr = [10, 15, 3, 8]
k = 17
for i in range(0, len(arr)):
arr_new.append(abs(arr[i] -17))
res= list(set(arr).intersection(arr_new))
if (len(res)>0):
print(str(res[0]) + " + " + str(res[1]) +"= "+ str(k ))
else:
print("No numbers add up to k")