ChameL1oN

PetrNik2

Apr 11th, 2022 (edited)
579
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.65 KB | None | 0 0
  1. /*
  2. Числовое кольцо. В кольце записаны N чисел, составляющих по часовой стрелке 3 числа: два слагаемых и сумму.
  3. Требуется написать программу, которая по строке чисел, считая ее кольцом, находит какое-нибудь решение в виде A+B=C.
  4. Все цифры числа должны входить в числа только один раз и в порядке следования в кольце. Цифр в кольце не более 1000.
  5. Формат входных данных: Входной файл содержит 1 строку, в которой без пробелов перечислены цифры кольца.
  6. Формат выходных данных: В выходной файл выводится тождество в виде <слагаемое1>+<слагаемое2>=<сумма> без пробелов внутри или слово «No», если решения не существует.
  7. */
  8.  
  9. #include <iostream>
  10. #include <fstream>
  11. #include <string>
  12.  
  13. using namespace std;
  14.  
  15. struct point {
  16.     char data;
  17.     point* next;
  18. };
  19.  
  20.  
  21. void print_list(point* beg)
  22. //печать списка
  23. {
  24.     point* p = beg;//начало списка
  25.     while (p != 0)
  26.     {
  27.         cout << p->data << "";
  28.         p = p->next;//переход к следующему элементу
  29.     }
  30. }
  31.  
  32. point* add(point* beg, char n) {
  33.     point* r = new(point);
  34.     r->data = n;
  35.     r->next = NULL;
  36.     point* p;
  37.     p = beg;
  38.         while (p->next != NULL) { //Идём по списку пока значение нового эл-та не станет меньше или до конца
  39.             p = p->next;
  40.         }
  41.         r->next = p->next;
  42.         p->next = r;
  43.     return beg;
  44. }
  45.  
  46. string getStringFromPoint(point* beg) {
  47.     string num = "";
  48.     point* p = beg;//начало списка
  49.     while (p != NULL) {
  50.         num += p->data;
  51.         p = p->next;
  52.     }
  53.     return num;
  54. }
  55.  
  56. int main()
  57. {
  58.     setlocale(LC_ALL, "Russian");
  59.     cout << "Старт программы" << endl;
  60.     string input_str = ""; //Переменная исходной строки
  61.  
  62.     //Считываем файл и заносим в исходную строку input_str
  63.     input_str = "01902021";
  64.  
  65.     int input_str_length = input_str.length();
  66.  
  67.     if (input_str_length >= 3 && input_str_length <= 1000) { //Проверка на дурака
  68.        
  69.         bool check = false; //Для остановки цикла
  70.  
  71.         int cycle = 0;
  72.         while (cycle < input_str_length + 1 && !check) { //Двигаем кольцо
  73.             cout << input_str << endl;
  74.             for (int j = 0; j < input_str_length - 2 && !check; j++) {
  75.                 point* A = new (point);
  76.                 point* B = new (point);
  77.                 point* C = new (point);
  78.                 A->data = input_str[0];    A->next = 0;
  79.                 B->data = input_str[j+1];    B->next = 0;
  80.                 C->data = input_str[j+2];    C->next = 0;
  81.                 //Заполнение первого списка
  82.                 for (int i = 1; i < j+1; i++) {
  83.                     add(A, input_str[i]);
  84.                 }
  85.  
  86.                 //Заполнение третьего списка оставшимеся цифрами
  87.                 for (int i = j + 3; i < input_str_length; i++) {
  88.                     add(C, input_str[i]);
  89.                 }
  90.                
  91.                 while (C->next != NULL && !check) {
  92.                    // cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl;
  93.                     cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl;
  94.                     point* p = C;
  95.                     C = C->next;
  96.                     p->next = NULL;
  97.                     point* r = B;
  98.                     while (r->next != NULL) { r = r->next; }
  99.                     r->next = p;
  100.                     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()))) {
  101.                         check = true;
  102.                         cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl;  //Записываем ответ в файл
  103.                         cout << "Ответ найден" << endl;
  104.                     }
  105.                    
  106.                 }
  107.                 cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl;
  108.                 //Дополнительная проверка для строки из 3х цифр
  109.                 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()))) {
  110.                     check = true;
  111.                     cout << getStringFromPoint(A) << " + " << getStringFromPoint(B) << " = " << getStringFromPoint(C) << endl; //Записываем ответ в файл
  112.                     cout << "Ответ найден" << endl;
  113.                 }
  114.             }
  115.             input_str += input_str[0];
  116.             input_str.erase(0, 1);
  117.             cycle++;
  118.             cout << endl;
  119.  
  120.         }
  121.         if (!check) cout << "No" << endl; //Записываем ответ в файл
  122.  
  123.  
  124.     }else {
  125.         cout << "Ошибка входных данных" << endl;
  126.     }
  127.    
  128.  
  129.  
  130.  
  131. }
Add Comment
Please, Sign In to add comment