Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Haskell
Перезагрузить страницу Помогите решить задачку!!!
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Johnnie Johnnie вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.06.2012
По умолчанию Помогите решить задачку!!! - 15.06.2012, 17:02

Написать программу символьного умножения двух многочленов от одной переменной.
Ответить с цитированием
  (#2 (permalink)) Старый
Jean-Esther Jean-Esther вне форума
Member
 
Сообщений: 22
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.03.2009
По умолчанию 19.06.2012, 08:19

Вот вариант. Вроде рабочий.
Полином хранится виде пар (коэффициент,показатель экспоненты).
Сумма тривиальна. Умножение тоже не сложно.
Привидение к нормальному виду происходит в функции collectExp, где приводятся подобные и убираются нули.
Техникой парсинга не владею, поэтому чтение не самое понятное в коде (перед знаками ставятся пробелы, чтоб можно было разбить на слова вида "10x^2" и распарсить коэффициент и показатель)

haskell Код:
import Data.List(groupBy,sortBy)
import Data.Char(isSpace)
type Polinomial = [(Integer,Int)]
readPol :: String -> Polinomial
readPol str = let ind '+'=" ";ind '-'=" -";ind x=[x]; str' = filter (not.isSpace) str >>= ind in map (\x->(koef x,exp x)) (words str')
    where
        koef = read . takeWhile (/='x')
        exp = read . tail . dropWhile (/='^')
sumPol :: Polinomial -> Polinomial -> Polinomial
sumPol = (++)
productPol :: Polinomial -> Polinomial -> Polinomial
productPol a b = a >>= \x -> map (mult x) b where mult (k1,n1) (k2,n2) = (k1*k2,n1+n2)
collectExp pol = filter ((0/=).fst) $ map sumSameExp (groupBy sameExp (sorted pol))
    where
        sorted pol = sortBy (\(_,n) (_,m) -> compare n m) pol
        sameExp ~(_,n1) ~(_,n2) = n1==n2
        sumSameExp list = (sum $ map fst list, snd $ head list)
showPol :: Polinomial -> String
showPol pol = do
    (k,n) <- collectExp pol
    let
        koef k = (if k<0 then '-' else '+'): show (abs k)
        expn n = case n of {0->""; 1->"x"; m->"x^"++show m;}
        in koef k ++ expn n
       
main = do
    putStr "First one: "
    a <- fmap readPol getLine
    putStr "Second one: "
    b <- fmap readPol getLine
    putStr ("Their sum is " ++ showPol (sumPol a b) ++ "\n")
    putStr ("Their product is " ++ showPol (productPol a b) ++ "\n")
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите решить задачку mrGray Prolog 3 20.06.2015 12:49
помогите решить задачку по прологу kosmoskir Prolog 8 16.11.2010 23:41
Помогите решить задачку Malinka21-dr Prolog 4 04.06.2010 22:00
Помогите решить задачку! repka Prolog 4 28.05.2010 00:59
помогите решить задачку romeo_sn Prolog 6 17.02.2010 20:54
Помогите решить задачку og4life Prolog 3 04.01.2010 19:44
Помогите, пожалйста, решить задачку! Coxxxxx Prolog 6 17.04.2009 00:28
Помогите решить задачку Вероничка Pascal 13 01.09.2008 23:22
Помогите решить задачку Сергеевна Prolog 2 27.01.2008 20:41
Помогите решить задачку Бывалый Prolog 5 19.12.2007 22:27
Помогите решить задачку! Tomaks Prolog 0 23.05.2007 10:30
ПОМОГИТЕ РЕШИТЬ ЗАДАЧКУ! moderntik Pascal 19 22.05.2006 18:57



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов