С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 02.07.2011
Сообщений: 8

Задача на рекурсию

08.10.2011, 17:41. Показов 4367. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Во время недавних раскопок на Марсе были обнаружены листы бумаги с таинственными символами на них. После долгих исследований учёные пришли к выводу, что надписи на них на самом деле могли быть обычными числовыми равенствами. Кроме того, из других источников было получено веское доказательство того, что марсиане знали только три операции - сложение, умножение и вычитание (марсиане никогда не использовали «унарный минус»: вместо «-5» они писали «0-5»). Также ученые доказали, что марсиане не наделяли операции разным приоритетом, а просто вычисляли выражения (если в них не было скобок) слева направо: например, 3+3*5 у них равнялось 30, а не 18. К сожалению, символы арифметических действий стерлись. Например, если была запись «18=7 (5 3) 2», то возможно восстановить эту запись как «18=7+(5-3)*2». Требуется написать программу, находящую требуемую расстановку знаков или сообщающую, что таковой не существует.
Входные данные

Первая строка входного файла INPUT.TXT состоит из натурального числа, не превосходящего 230, знака равенства, и последовательности натуральных чисел (не более десяти), произведение которых также не превосходит 230. Некоторые группы чисел (одно или более) могут быть окружены скобками. Длина входной строки не будет превосходить 80 символов, и других ограничений на количество и вложенность скобок нет. Между двумя соседними числами, не разделенными скобками, всегда будет хотя бы один пробел, во всех остальных местах может быть любое (в том числе и 0) число пробелов (естественно, внутри числа пробелов нет).
Выходные данные

В выходной файл OUTPUT.TXT необходимо вывести одну строку, содержащую полученное равенство (т.е., исходное равенство со вставленными знаками арифметических действий без лишних пробелов). В случае если требуемая расстановка знаков невозможна, вывести строку, состоящую из единственного числа «-1». Выходная строка не должна содержать пробелов.
Примеры
№ INPUT.TXT OUTPUT.TXT
1 18=7 (5 3) 2 18=7+(5-3)*2
2 5= 3 3 -1
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2011, 17:41
Ответы с готовыми решениями:

Задача на рекурсию
Задание: написать функцию умножения двух чисел, используя только операции сложения и рекурсии. Не понимаю как это сделать( Прошу...

Задача на рекурсию
Всем доброго времени суток. Прошу подсказать мне условие задачи на рекурсию(нам дали задание самим придумать себе задание и выполнить...

Задача на рекурсию
Помогите описать функцию, которая, выдавала бы элемент списка по заданному номеру, считая от конца, учитывая элементы подсписков. Например,...

7
81 / 81 / 8
Регистрация: 10.06.2011
Сообщений: 258
08.10.2011, 19:46
И что уже решено?
0
0 / 0 / 0
Регистрация: 02.07.2011
Сообщений: 8
08.10.2011, 20:06  [ТС]
пока нет
0
81 / 81 / 8
Регистрация: 10.06.2011
Сообщений: 258
08.10.2011, 21:17
Не вообще, а частично: т.е. что ты уже сделал для того, чтобы решить твою задачу?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
09.10.2011, 00:14
уточни пожалуйста - скобки я сам выбираю где будут стоять или они заданы в INPUT? Будут ли скобки симметричны или существует вероятность появления незакрытых? И что за остальные случаи когда между числами нет пробелов? И последнее - вариантов решения может быть больше одного, они нужны все или только первое попавшеся?
0
0 / 0 / 0
Регистрация: 02.07.2011
Сообщений: 8
09.10.2011, 10:23  [ТС]
Скобки должны быть симметричные и заданные в input. Вариант решение можно выводить только первый попавшийся. Если между числами нет пробелов, то это значит одно число, то есть 123 - это "123", а не "12" и "3"
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
09.10.2011, 20:44
Вобщем программа работает, но только с условием что на вокруг знака равно нет пробелов (лень было обделывать ещё и это, оставим эту работу на труд заказчика )

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.LinkedList;
 
public class Marthians {
 
    public static void main(String[] args) {
        File file = new File("INPUT.txt");
        File fout = new File("OUTPUT.txt");
        if (fout.exists()) {
            fout.delete();
            try {
                fout.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileWriter wout = null;
        try {
            wout = new FileWriter(fout);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        LineNumberReader lnr = null;
        try {
            lnr = new LineNumberReader(new FileReader(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        String line;
        MarsExec marsExec;
        try {
            while ((line = lnr.readLine()) != null) {
                marsExec = new MarsExec(line);
                wout.write(line + " " + marsExec.findResult());
                wout.write(" ");
            }
            wout.write("\n");
            wout.flush();
            wout.close();
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }
 
    private static class MarsExec {
        private String unparsedLine;
        private Integer expectResult;
        private ArrayList<String> operations = new ArrayList<String>();
 
        private static char signList[] = { '+', '-', '*' };
 
        public MarsExec(String line) {
            this.unparsedLine = line.split("=")[1];
            this.expectResult = Integer.parseInt(line.split("=")[0]);
        }
 
        public String findResult() {
            String result = "-1";
            String[] digitsWithSquares = unparsedLine.split(" ");
            int len = digitsWithSquares.length - 1;
            operations.clear();
            StringBuffer sb = new StringBuffer(len);
            char currentChar = signList[0];
            for (int i = 1; i <= len; i++) {
                sb.append(currentChar);
            }
            changeCharacters(0, sb, len);
            String[] workOperators;
            String executeLine;
            for (String currentOperators : operations) {
                workOperators = currentOperators.split("");
                executeLine = createExecuteLine(workOperators, digitsWithSquares);
//              System.out.println("execline " + executeLine);
                if (expectResult == eval(executeLine)) {
                    result = expectResult + "=" + executeLine;
                    break;
                }
            }
            return result;
        }
 
        private String createExecuteLine(String[] workOperators, String[] digitsWithSquares) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < workOperators.length; i++) {
                sb.append(workOperators[i]);
                sb.append(digitsWithSquares[i]);
            }
            return sb.toString();
        }
 
        boolean isOperator(char c) {
            return c == '+' || c == '-' || c == '*';
        }
 
        int priority(char op) {
            switch (op) {
            case '+':
            case '-':
            case '*':
                return 1;
            default:
                return -1;
            }
        }
 
        boolean isDelim(char c) {
            return c == ' ';
        }
 
        void processOperator(LinkedList<Integer> st, char op) {
            int r = st.removeLast();
            int l = st.removeLast();
            switch (op) {
            case '+':
                st.add(l + r);
                break;
            case '-':
                st.add(l - r);
                break;
            case '*':
                st.add(l * r);
                break;
            }
        }
 
        private int eval(String s) {
            LinkedList<Integer> st = new LinkedList<Integer>();
            LinkedList<Character> op = new LinkedList<Character>();
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (isDelim(c))
                    continue;
                if (c == '(')
                    op.add('(');
                else if (c == ')') {
                    while (op.getLast() != '(')
                        processOperator(st, op.removeLast());
                    op.removeLast();
                } else if (isOperator(c)) {
                    while (!op.isEmpty() && priority(op.getLast()) >= priority(c))
                        processOperator(st, op.removeLast());
                    op.add(c);
                } else {
                    String operand = "";
                    while (i < s.length() && Character.isDigit(s.charAt(i)))
                        operand += s.charAt(i++);
                    --i;
                    st.add(Integer.parseInt(operand));
                }
            }
            while (!op.isEmpty())
                processOperator(st, op.removeLast());
            return st.get(0);
        }
 
        private StringBuffer changeCharacters(int pos, StringBuffer sb, int length) {
            for (int i = 0; i <= signList.length - 1; i++) {
                sb.setCharAt(pos, signList[i]);
                if (pos == length - 1) {
                    operations.add(sb.toString());
                } else {
                    changeCharacters(pos + 1, sb, length);
                }
            }
            return sb;
        }
    }
}
1
0 / 0 / 0
Регистрация: 02.07.2011
Сообщений: 8
09.10.2011, 21:24  [ТС]
большое спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2011, 21:24
Помогаю со студенческими работами здесь

Задача на рекурсию
Помогите, пожалуйста, решить задачу.

Задача на рекурсию
Дано число. Вывести все цифры этого числа, не используя дополнительных библиотек, массивов, списков и т.д. Использовать только...

Задача на рекурсию
помогите написать пожалуйста программу на с++ по теме рекурсия. Задано действительное A, найти среди чисел 1; 1+1/2; 1+1/2+1/3;.... ...

Задача на рекурсию
посажена картошка: 30 рядков по 20 лунок в каждом. 1. Смоделировать картофельное поле, зная, что в лунке может расти не более 8...

Задача на рекурсию
Помогите пожалуйста. Есть задача: Дана последовательность a с элементами из множества {0,1}. Проводятся следующие действия. Если a имеет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru