Всё сущее есть числа, или перевод римского числа в арабское
Доброго времени суток, %username%.
После прочтения статьи о преобразовании арабских чисел в римские задался целью написать статью о проведении обратных действий, то есть преобразование чисел из римской системы обратно в родную арабскую. Алгоритм решил оформить на JAVA, так как в данное время изучаю именно его. Алгоритм достаточно тривиален, но может, кому нить придется по душе.
Ниже приведен код, написанный на JAVA реализующий алгоритм.
class ArabicToRoman < static String[] Rome = < "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" >; static int[] Arab = < 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 >; public int RometoArab(String rome) < public int RometoArab(String rome) < StringBuffer romeNumber = new StringBuffer(rome); int arabNumber = 0, i = 0; // Проверяем переданную строку на наличие символов if (romeNumber.length() >0) < while (true) < do < if (Rome[i].length() else break; > else break; > while (true && romeNumber.length() != 0); i++; > > return 0; > >
Как конвертировать римские цифры в арабские java
Регистрация: 18.12.2016
Сообщений: 37
Из арабских в римские, и обратно .
Вот код готового проекта на Groovy .
Я размещаю его здесь по двум причинам:
1. В качестве примера GUI небольшого приложения (вдруг кто то найдет для себя что нибудь полезное . )
2. И для того чтобы улучшить его функциональность (с помощью вопросов-ответов . )
Итак как сделать так, чтобы:
Текст в текстовых полях был разного цвета;
При нажатии Enter происходил перевод числа из активного поля;
При нажатии Delete происходило очищение активного поля;
А так же мне надо знать как применить regex к полям, чтобы в них печатался только тот текст который соответствует этим regex (сами regex уже готовы)
//chislo1.groovy package groovy import groovy.swing.SwingBuilder import javax.swing.* import java.awt.FlowLayout import java.util.* import java.awt.* import java.awt.event.* public class ArabRim_2 < def Arabrim_2 (Arab) < ArabRim m3 = new ArabRim(); def Rim = m3.Arabrim(Arab); return Rim >> def Arabrim (Arab) public class RimArab_2 < def Rimarab_2 (Rim) < RimArab m1 = new RimArab(); def Arab = m1.Rimarab(Rim); return Arab >> def Rimarab (Rim) swinger = new SwingBuilder() gui = swinger.frame(title:'Арабские > Римские', size: [540, 160]) < panel(layout: new FlowLayout()) < arabrim = new JLabel('Это приложение переводит из арабской системы счисления в римскую и обратно !') arabrim.setBorder(BorderFactory.createEtchedBorder()) panel().add(arabrim) panel(layout: new FlowLayout()) < arab = new JLabel('Арабское число:') panel().add(arab) message1 = textField(columns: 12) button11 = swinger.button(text: 'Вычислить', actionPerformed: ")>) button12 = swinger.button(text: 'Очистить', actionPerformed: ) > panel(layout: new FlowLayout()) < rim = new JLabel('Римское число:') panel().add(rim) message2 = textField(columns: 12) button21 = swinger.button(text: 'Вычислить', actionPerformed: ")>) button22 = swinger.button(text: 'Очистить', actionPerformed: ) >>> gui.show()
//ArabRim.groovy package groovy public class ArabRim < String Rim, A, r, r2, r1 Integer i, x, iI, iV, iX, x1 List L, rim = [ "I", "V", "X", "L", "C", "D", "M"] def Arabrim (Arab) < A = Arab.reverse(); i = 0; L = [] for( v in A)< x = v as Integer; iI = i*2; iV = 2*i+1; iX = 2*i+2 switch (x)< case 4: r = rim[iI] + rim[iV]; break case 9: r = rim[iI] + rim[iX]; break case 1..3: r = ""; for( int j = 0; j < x; j++)< r = r + rim[iI]>; break case 5..8: r2 = ""; x1 = x - 5; for( int j = 0; j < x1; j++)< r2 = r2 + rim[iI]>; r1 = rim[iV]; r = r1 + r2; break case 0: r = ""; break > ++i; L = L + r > Rim = L.reverse().join() > >
//RimArab.groovy package groovy public class RimArab < String f; Integer Arab Map rimArab = ["I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000] def Rimarab (Rim) < f = Rim.replace("IV", "IIII").replace("IX", "VIIII").replace("XL", "XXXX").replace("XC", "LXXXX").replace("CD", "CCCC").replace("CM", "DCCCC") Arab = 0; for(i in f) < Arab = Arab + rimArab[i]>; return Arab > >
//Main.java package javaclass; public class Main < public static void main(String args[]) < chislo1 m2 = new chislo1(); m2.run(); chislo1 m4 = new chislo1(); m4.run(); >>
//chislo1.java package javaclass; class chislo1 < void run() < throw new UnsupportedOperationException("Not yet implemented"); >>
Цифровое онлайн-преобразование римских цифр в арабские
наЦифровое онлайн-преобразование римских цифр в арабские:
Этот интерактивный инструмент преобразования римских цифр в арабские цифры поможет вам преобразовать римские цифры в арабские цифры, введите римские цифры, и арабское число отобразится в окне результатов.
Римские цифры:
Римские цифры используют латинские буквы для обозначения чисел («I» :»1″, «V» :»5″, «X» :»10″, «L» :»50″, «C» :»100″, «D» :»500″, «M» :»1000″) . Римская система счисления часто используется при сортировке бумаг и книг.
Как преобразовать римские цифры в арабские цифры?
- Шаг 1. Запомните значения, представленные латинским алфавитом в следующем порядке: (‘I’: 1, ‘V’: 5, ‘X’: 10, ‘L’: 50, ‘C’: 100, ‘D’: 500, ‘M’: 1000) .
- Шаг 2: Слева направо, если латинский алфавит появляется перед латинским алфавитом, который больше его, вычтите значение, представленное латинским алфавитом. Пример 2.1: IV = V — I = 5 — 1 = 4 Пример 2.2: XL = X — L = 50 — 10 = 40
- Шаг 3: В других случаях увеличьте значение, представленное этой латинской буквой. Пример 3.1: XXXV = X + X + X + V = 10 + 10 + 10 + 5 = 35 Пример 3.2: CXXIII = C + X + X + I + I + I = 100 + 10 + 10 + 1 + 1 + 1 = 123
Пример 1: преобразование римской цифры «CXLVI» в арабские цифры:
CXLVI = C + XL + V + I = 100 + (500-10) + 5 + 1 = 146
Пример 2. Преобразование римской цифры «CDXCIV» в арабские цифры:
CDXCIV = CD + XC + IV = (500-100) + (100-10) + (5-1) = 494
Таблица перевода римских цифр в арабские:
| Римские цифры | Арабские цифры | Римские цифры | Арабские цифры |
|---|---|---|---|
| I | 1 | XXI | 21 |
| II | 2 | XXII | 22 |
| III | 3 | XXIII | 23 |
| IV | 4 | XXIV | 24 |
| V | 5 | XXV | 25 |
| VI | 6 | XXVI | 26 |
| VII | 7 | XXVII | 27 |
| VIII | 8 | XXVIII | 28 |
| IX | 9 | XXIX | 29 |
| X | 10 | XXX | 30 |
| XI | 11 | XXXI | 31 |
| XII | 12 | XXXII | 32 |
| XIII | 13 | XXXIII | 33 |
| XIV | 14 | XXXIV | 34 |
| XV | 15 | XXXV | 35 |
| XVI | 16 | XXXVI | 36 |
| XVII | 17 | XXXVII | 37 |
| XVIII | 18 | XXXVIII | 38 |
| XIX | 19 | XXXIX | 39 |
| XX | 20 | XL | 40 |
ссылка:
Преобразование римских цифр в арабские цифры в Python:
def transform_roman_numeral_to_number(roman_numeral): roman_char_dict = res = 0 for i in range(0, len(roman_numeral)): if i == 0 or roman_char_dict[roman_numeral[i]] equal to:'.format(roman_numeral_input, number_output)) ------------------- Roman numeral MMXVIII equal to:2018
Преобразование римских цифр в арабские числа в Java:
import java.util.Map; import java.util.HashMap; public class NumberConvertManager < public static int transform_roman_numeral_to_number(String roman_numeral) < Maproman_char_dict = new HashMap(); roman_char_dict.put('I', 1); roman_char_dict.put('V', 5); roman_char_dict.put('X', 10); roman_char_dict.put('L', 50); roman_char_dict.put('C', 100); roman_char_dict.put('D', 500); roman_char_dict.put('M', 1000); int res = 0; for (int i = 0; i < roman_numeral.length(); i += 1) < if (i == 0 || roman_char_dict.get(roman_numeral.charAt(i)) return res; > public static void main(String[] args) < String roman_numeral_input = "MMXVIII"; int number_output = transform_roman_numeral_to_number(roman_numeral_input); System.out.println("Roman numeral " + roman_numeral_input + " equal to:" + number_output); >> ------------------- Roman numeral MMXVIII equal to:2018
Как преобразовать римские цифры в арабские на Java? [дубликат]
Как преобразовать римские цифры в арабские на Java чтобы в дальнейшем выполнять с ними простейшие арифметические действия?
Отслеживать
задан 21 янв 2021 в 7:04
21 1 1 серебряный знак 1 1 бронзовый знак
А сами что пробовали сделать на пути к решению вопроса?
21 янв 2021 в 7:05
21 янв 2021 в 7:19
Посмотрите здесь: ru.stackoverflow.com/questions/764529/…
21 янв 2021 в 8:29
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Делюсь из своих закромов — уже не помню для чего писал (наверное был какой-то тест, видимо условие было не использовать коллекции типа Map , оттуда и возник дихотомический поиск):
public class Roman2Arabic < private static int[] intervals=; private static String[] numerals=; public static void main(String args[]) < int i=1974; String roman=toRoman(i); int arabic = toArabic(roman); System.out.println("Initial="+i+", roman="+roman+", arabic="+arabic); >/** * Dichotomic search in sorted array of intervals * @param number * @return floor index closest to number */ private final static int findFloor(final int number, final int firstIndex, final int lastIndex) < if(firstIndex==lastIndex) return firstIndex; if(intervals[firstIndex]==number) return firstIndex; if(intervals[lastIndex]==number) return lastIndex; final int median=(lastIndex+firstIndex)/2; if(median==firstIndex) return firstIndex; if(number == intervals[median]) return median; if(number >intervals[median]) return findFloor(number, median, lastIndex); else return findFloor(number, firstIndex, median); > public final static String toRoman(final int number) < int floorIndex=findFloor(number, 0, intervals.length-1); if(number==intervals[floorIndex]) return numerals[floorIndex]; return numerals[floorIndex]+toRoman(number-intervals[floorIndex]); >public static int toArabic(String roman) < int result = 0; for (int i = intervals.length-1; i >= 0; i-- ) < while (roman.indexOf(numerals[i]) == 0 && numerals[i].length() >0) < result += intervals[i]; roman = roman.substring(numerals[i].length()); >> return result; > >
