![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 18.01.2008
Сообщений: 22
|
![]()
Доброго времени суток, всем! Подскажите пожалуйста, очень нужна помощь... Дана задача: Для представления римских цифр используются символы: I – один, V – пять, X – десять, L – пятьдесят, C – сто, D – пятьсот, M – тысяча. Для изображения числа с помощью римских цифр используются общеизвестные правила: так например
482 – CDLXXXII, 1999 – MCMXCIX. Напишите функцию (f R), которая переводит число R, запис-е римскими цифрами, в десятичную запись, например ( f’ (CDLXXXII))=482. Исходное число не превышает 1999. Сам алгоритм я понял, что берется голова списка, сравнивается с хвостом, если голова по значению больше=> числа складываются, если меньше, соответственно, отнимаются. Например: CDLXXXII, берется С=сто, сравнивается с хвостом (хвост, рекурсивно опять проверяет, только теперь сравнивает D с остальным и т.д.) Как задать сопоставление букв с цифрами, в самом теле функции? Т.е. задается же список буквами, а мне надо сравнивать эти самые буквы (только в численном значении)... Заранее спасибо всем, кто заглянул! P.S: язык программирования Лисп |
![]() |
![]() |
![]() |
#2 |
Особый статус
Участник клуба
Регистрация: 24.11.2008
Сообщений: 1,535
|
![]()
А где взять компилятор лисп? (Может, в VBA сойдёт?)
Формула 1 (календарь чемпионата-2016): 26.11.2016 15:55 — Абу-Даби: http://ru.wikipedia.org/wiki/Гран-при_Абу-Даби — (квалификация)! Эфир: http://lion-tv.com/28-match-tv.html
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 18.01.2008
Сообщений: 22
|
![]()
ну я xLisp скачивал...старенький правада, но там большой разницы нету..
|
![]() |
![]() |
![]() |
#4 |
Особый статус
Участник клуба
Регистрация: 24.11.2008
Сообщений: 1,535
|
![]()
В приложенном документе — запуск через Alt-F8.
Код:
Формула 1 (календарь чемпионата-2016): 26.11.2016 15:55 — Абу-Даби: http://ru.wikipedia.org/wiki/Гран-при_Абу-Даби — (квалификация)! Эфир: http://lion-tv.com/28-match-tv.html
Последний раз редактировалось Sasha_Smirnov; 05.03.2010 в 00:49. Причина: убрал вариант с русскими буквами (ХХ — не ха-ха, а всё-таки икс-икс), тем более такие «цифры», как ХШ. |
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]() Цитата:
Теперь составьте функу, которая методом отсечения головы и хвоста находила бы такой хвост (нужная Вам цифра), который бы соответствовал бы Вашей букве ![]() Допустим Вам нужна буква V - смотрите голову, раз I значит откидываем из списка голову и хвост, если совпало, то читаем хвост. Думаю не очень сложно.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 18.01.2008
Сообщений: 22
|
![]()
спасибо большое, буду пробовать. а алгоритм, Саши Смирнова что-то не совсем понял... он видимо на другом компиляторе, увы, мне не знаком... Но за помощь, преогромнейшее спасибо!!!
|
![]() |
![]() |
![]() |
#7 |
Особый статус
Участник клуба
Регистрация: 24.11.2008
Сообщений: 1,535
|
![]()
Всё же, если у вас есть Word, испытайте мой код. А то зря старался.
Алгоритм там прост: читаю справа налево — и прибавляю либо вычитаю (в зависимоcти от того, какая следующая) римскую цифру. Если, например, число IX — прибавляем 10, а 1 — вычитаем (ибо за ним идёт 10, а 10 > 1).
Формула 1 (календарь чемпионата-2016): 26.11.2016 15:55 — Абу-Даби: http://ru.wikipedia.org/wiki/Гран-при_Абу-Даби — (квалификация)! Эфир: http://lion-tv.com/28-match-tv.html
|
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 18.01.2008
Сообщений: 22
|
![]()
ребята, подскажите пожалуйстаааа(( вот без, сопоставления римских числе и арабских, алгоритм получился вроде так:
(defun f (n) (let ((a (reverse n))) (cond ((null a) 0) ((> (first a) (f (rest a))) (- (first a) (f (rest a)))) (t (+ (first a) (f (rest a)))) )) ) но почему-то не всегда считает правильно... т.е. чтобы задать 482 = CDLXXXI, задаем в списке (100 500 50 10 10 10 1 1). что не правильно? заранее, спасибо |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 18.01.2008
Сообщений: 22
|
![]()
вот что получилось, без сопоставления:
(defun f (n) (cond ((null n) 0) ((< (first n) (f (rest n))) (- (f (rest n)) (first n))) (t (+ (first n) (f (rest n)))) ) ) единственное, что теперь надо, это заменить подряд идущие цифры на сумму этих цифр, например: 100 500 50 10 10 10 1 1 = 100 500 50 30 2, и тогда все будет считаться правильно. Подскажите пожалуйста, как это можно осуществить в лиспе. |
![]() |
![]() |
![]() |
#10 |
Особый статус
Участник клуба
Регистрация: 24.11.2008
Сообщений: 1,535
|
![]()
А нельзя сразу — суммировать? Замена видится мне лишней.
(Ну нет компилятора!) Опечаточка!.. А вдруг они и в коде — как без копилятора проверить?
Формула 1 (календарь чемпионата-2016): 26.11.2016 15:55 — Абу-Даби: http://ru.wikipedia.org/wiki/Гран-при_Абу-Даби — (квалификация)! Эфир: http://lion-tv.com/28-match-tv.html
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как сопоставить ячейки | hunter05 | Microsoft Office Excel | 2 | 05.04.2009 14:37 |
Как сопоставить 2 файла exel? | yasya22 | Microsoft Office Excel | 2 | 22.04.2008 22:48 |