Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Числовое кольцо. В кольце записаны N чисел, составляющих по часовой стрелке 3 числа: два слагаемых и сумму.
- Требуется написать программу, которая по строке чисел, считая ее кольцом, находит какое-нибудь решение в виде A+B=C.
- Все цифры числа должны входить в числа только один раз и в порядке следования в кольце. Цифр в кольце не более 1000.
- Формат входных данных: Входной файл содержит 1 строку, в которой без пробелов перечислены цифры кольца.
- Формат выходных данных: В выходной файл выводится тождество в виде <слагаемое1>+<слагаемое2>=<сумма> без пробелов внутри или слово «No», если решения не существует.
- */
- #include <iostream>
- #include <fstream>
- #include <string>
- using namespace std;
- struct point {
- char data;
- point* next;
- };
- void print_list(point* beg)
- //печать списка
- {
- point* p = beg;//начало списка
- while (p != 0)
- {
- cout << p->data << "";
- p = p->next;//переход к следующему элементу
- }
- }
- point* add(point* beg, char n) {
- point* r = new(point);
- r->data = n;
- r->next = NULL;
- point* p;
- p = beg;
- while (p->next != NULL) { //Идём по списку пока значение нового эл-та не станет меньше или до конца
- p = p->next;
- }
- r->next = p->next;
- p->next = r;
- return beg;
- }
- string getStringFromPoint(point* beg) {
- string num = "";
- point* p = beg;//начало списка
- while (p != NULL) {
- num += p->data;
- p = p->next;
- }
- return num;
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- cout << "Старт программы" << endl;
- string input_str = ""; //Переменная исходной строки
- //Считываем файл и заносим в исходную строку input_str
- input_str = "01902021";
- int input_str_length = input_str.length();
- if (input_str_length >= 3 && input_str_length <= 1000) { //Проверка на дурака
- bool check = false; //Для остановки цикла
- int cycle = 0;
- while (cycle < input_str_length + 1 && !check) { //Двигаем кольцо
- cout << input_str << endl;
- for (int j = 0; j < input_str_length - 2 && !check; j++) {
- point* A = new (point);
- point* B = new (point);
- point* C = new (point);
- A->data = input_str[0]; A->next = 0;
- B->data = input_str[j+1]; B->next = 0;
- C->data = input_str[j+2]; C->next = 0;
- //Заполнение первого списка
- for (int i = 1; i < j+1; i++) {
- add(A, input_str[i]);
- }
- //Заполнение третьего списка оставшимеся цифрами
- for (int i = j + 3; i < input_str_length; i++) {
- add(C, input_str[i]);
- }
- while (C->next != NULL && !check) {
- // cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl;
- cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl;
- point* p = C;
- C = C->next;
- p->next = NULL;
- point* r = B;
- while (r->next != NULL) { r = r->next; }
- r->next = p;
- if (A->data != '0' && B->data != '0' && C->data != '0' && (atoi(getStringFromPoint(A).c_str()) + atoi(getStringFromPoint(B).c_str()) == atoi(getStringFromPoint(C).c_str()))) {
- check = true;
- cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl; //Записываем ответ в файл
- cout << "Ответ найден" << endl;
- }
- }
- cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl;
- //Дополнительная проверка для строки из 3х цифр
- if (!check && A->data != '0' && B->data != '0' && C->data != '0' && (atoi(getStringFromPoint(A).c_str()) + atoi(getStringFromPoint(B).c_str()) == atoi(getStringFromPoint(C).c_str()))) {
- check = true;
- cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl; //Записываем ответ в файл
- cout << "Ответ найден" << endl;
- }
- }
- input_str += input_str[0];
- input_str.erase(0, 1);
- cycle++;
- cout << endl;
- }
- if (!check) cout << "No" << endl; //Записываем ответ в файл
- }else {
- cout << "Ошибка входных данных" << endl;
- }
- }
Add Comment
Please, Sign In to add comment