Magic Numbers [CodeForces – 320A]

Magic Numbers [CodeForces – 320A]

一个数字,若它是由1,14,144组成,则它是魔法数。如果一个数字是魔法数,那么给它前续和后缀一个魔法数它仍是魔法数,现在给出一个数字,需要请你判断一下它是不是魔法数

haskell来解想一种递归的解法,对于数字先判断它是否有非1与非4的数字,若有就直接返回不是魔法数,否则,若它是0位,则它就是魔法数,若它是1位,若这1位是1则也是,若它有2位,则首位是1的情况下递归的求后边的位,或判断这两位是否为14,若它是3位,则判断首位是1的情况下递归的求后边以及头2位是14的情况下求后边的再或者它本身是否是144;而其它情况当它长度大于3的时候,就判断若头1位是1,则递归的求1位之后是否正确,若头2位是14,则判断两位后是否正确,若头3位是144则判断三位后是否正确。

import Data.List

main=do
    line<-getLine
    putStrLn $ if solve line==True then "YES" else "NO"

solve :: [Char]->Bool
solve []=True
solve s 
    | length s ==0 = True
    | length s==1 =  s=="1"
    | length s==2 = or [if (fst $ splitAt 1 s )=="1" then solve $ snd $ splitAt 1 s else False, s=="14"]
    | otherwise = or [if (fst $ splitAt 1 s )=="1" then solve $ snd $ splitAt 1 s else False,if (fst $ splitAt 2 s )=="14" then solve $ snd $ splitAt 2 s else False,if (fst $ splitAt 3 s )=="144" then solve $snd $ splitAt 3 s else False]

发表评论

电子邮件地址不会被公开。 必填项已用*标注