0

我正在做项目 euler question 33并且已经划分了一个重构来解决它,但我想不出如果它在两个xy. 我做到了这一点:

import Ratio
import List
p33 =  [ (x%y) | y <- [10..99] , x <- [10..y], (x `rem` 10) /= 0 , (y `rem` 10) /= 0 , x /= y , (length $ nub $ concat $ map decToList [x,y]) == 3 , [numerator(x%y),denominator(x%y)] == WHAT GOES HERE? ]

不允许取消 0。它应该做的是:

49/98 {cancel the 9's}

要得到:

结果是 4/8。但我想不出如何从每个数字中删除常用数字。

4

1 回答 1

4

xy成为这两个数字。然后可以像这样删除与x它有共同点的数字y

Prelude> import Data.List
Prelude Data.List> let x = 68
Prelude Data.List> let y = 76
Prelude Data.List> read (show x \\ show y) :: Int
8

翻转xy从 中删除数字y。这使用,它删除了from中每个元素的第一次出现。xsData.List.(\\)ysysxs


编辑:您现在可能已经解决了问题 33。如果没有,让我再给你一些提示:

我上面给出的代码,即read (show x \\ show y)并不真正适合这个问题。如果对于某些数字abx等于aby等于ba会发生什么?

这个问题的解决方案可以写成一个单一的列表推导式。您可能希望在列表理解中使用Data.List.intersectData.List.nub创建以下术语:

s <- nub $ intersect (show x) (show y)

现在s的范围超过了那些xy有共同点的数字。您可以从中删除这些xy使用

map (read . delete s . show) [x, y]

如果不为你解决这个练习,我不能说得更清楚,但我会给你两个提示:

  • 在您编写的代码y <- [10..99], x <- [10..y], x /= y中。请注意,这可以更简洁地写为y <- [10..99], x <- [10..y-1].
  • 看看Data.Ratio,它提供了一种简单的方法来测试有理数的相等性,并自动计算分数的分子和分母的简化形式。
于 2009-10-25T10:27:11.843 回答