С Новым годом! Форум программистов, компьютерный форум, киберфорум
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 08.05.2019
Сообщений: 14

Какое минимальное количество приписать справа от числа, что бы число стало симметричным?

12.05.2019, 00:09. Показов 1541. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Очередная учебная задача, второй вечер голову ломаю. Гуру алгоритмов, буду благодарен вашей помощи
Задача:
Последовательность чисел называется симметричной, если она одинаково читается как слева направо, так и справа налево. Например 1245421 или 123321. Дано произвольное число. Требуется определить, какое минимальное количество и каких цифр надо приписать справа от этого числа, что бы число стало симметричным.

Переломав себе всю голову и перегуглив всю всемирную паутину, имею код на С++ который работает, причем так как надо.
C++
C++
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
#include <iostream>
using namespace std;
 
bool is_sym(const int* first, const int* last) {
    if (first >= last) return true;
    if (*first != *last) return false;
    return is_sym(first + 1, last - 1);
}
 
int main() {
    const int size = 5;
    int arr[size] = { 1, 2, 3, 4, 5 };
 
    int counter = 0;
    int* start = arr;
    while (!is_sym(start, arr + size - 1)) {
        ++counter;
        ++start;
    }
    cout << counter << endl;
 
    for (int i = counter - 1; i >= 0; --i) {
        cout << arr[i] << ' ';
    }
 
    system("pause");
    return 0;
}


Но, когда пытаюсь, вроде точно такой же алгоритм реализовать в 1С, он работает не верно. Например, при данных массива { 1 2 1 2 2 } на выходе мы должны получить "1, 2, 1", а получаем только "1".
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
&НаКлиенте
Функция ЭтоСумма(Первое, Последнее)
    
    Если Первое >= Последнее Тогда
        Возврат Истина;
    КонецЕсли;
    
    Если Первое <> Последнее Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Возврат ЭтоСумма(Первое + 1, Последнее - 1);
    
КонецФункции
1C
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
&НаКлиенте
Процедура Задача3_14(Команда)
    
    Массив = Новый Массив;
    
    Массив.Добавить(1);
    Массив.Добавить(2);
    Массив.Добавить(3);
    Массив.Добавить(4);
    Массив.Добавить(5);
    
    
    Счетчик = 0;
    к = 0;
    
    Пока НЕ ЭтоСумма(Массив.Получить(к), Массив.Получить(Массив.ВГраница())) Цикл
        Счетчик = Счетчик + 1;
        к = к + 1;
    КонецЦикла;
    
    Если Счетчик = 0 Тогда
        Сообщить("Оно уже!");
    Иначе  
        Сообщить("Минимальное кол-во цифр: " + Счетчик);
        
        i = Счетчик - 1;
        Пока i >= 0 Цикл
            Сообщить(Массив.Получить(i));
            i = i - 1;
        КонецЦикла;
    КонецЕсли;
        
КонецПроцедуры

Буду рад любому ответу. Не прошу решать всю задачу за меня, хотя бы подтолкнуть на мысль, где и что я делаю не так. И, пожалуйста, помидорами не кидайте за говнокод, это только мои начинания. Всем заранее огромное спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2019, 00:09
Ответы с готовыми решениями:

Какое минимальное количество и каких чисел надо приписать в конец последовательности, чтобы она стала симметричной?
Добрый день. Не понимаю как решить данную задачу с informatics. Но очень интересно как решается. Прошу вас помочь решить. Вот задачка: ...

Какое минимальное число букв необходимо заменить в слове Х, с тем, чтобы оно стало перевертышем?
Доброго времени суток! Крайне необходима помощь экспертов в С++! Кто может - не оставьте меня в беде))) Вот задания: 4. Какое...

Какое минимальное число букв необходимо заменить в слове Х, с тем, чтобы оно стало перевертышем?
Доброго времени суток! Крайне необходима помощь экспертов в Pascal Вот задания: 4. Какое минимальное число букв необходимо заменить в...

6
6 / 4 / 2
Регистрация: 02.05.2019
Сообщений: 33
12.05.2019, 08:02
Если я правильно понял задачу, тогда вот так можно решить одной функцией:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    ВхЧисло = 0;
    
    Если ВвестиЧисло(ВхЧисло) Тогда //вводим число, которое необходимо обработать
        ВхЧисло = Строка(Формат(ВхЧисло, "ЧГ="));
    Иначе 
        ВхЧисло = Строка("12345"); // если пользователь отказался, выдадим результат по умолчанию
    КонецЕсли;
    
    Б = СтрДлина(ВхЧисло) - 1;
    
    ИсхСтрока = ВхЧисло;
    
    Пока Б >= 1 Цикл
        ИсхСтрока = ИсхСтрока + Сред(ВхЧисло, Б, 1);//строим обратную цепочку    
        Б = Б - 1;
    КонецЦикла;
    
    Предупреждение("Ваше число: " + (ИсхСтрока));//выдаем результат пользователю
Добавлено через 11 минут
Вот не докопировал:
1C
1
2
3
Предупреждение("Ваше число: " + (ИсхСтрока) + Символы.ПС
            + "необходимо добавить: " + (СтрДлина(ВхЧисло) - 1) + " цифр" + Символы.ПС
            + "добавленные цифры: " + Прав(ИсхСтрока, СтрДлина(ИсхСтрока)- СтрДлина(ВхЧисло)));//выдаем результат пользователю
0
0 / 0 / 0
Регистрация: 08.05.2019
Сообщений: 14
12.05.2019, 13:19  [ТС]
Denis_cfo, спасибо бро за ответ. Проверил твой код, при входных данных (1, 2, 1, 2, 2) выдает результат 4 цифры (2121) , хотя минимальное кол-во будет 3 (121). Пример №2, при входных данных (1, 2, 3, 4, 5, 4, 3, 2, 1) выдает результат (23454321), хотя это число уже симметричное. Я похожий алгоритм пробовал, тут все таки, мне кажется, необходимо при каждой добавленной цифре проверять на симметричность.

Добавлено через 2 часа 22 минуты
Вроде работает, перепроверил много раз, но почему-то сомнения не уходят. Может кто со свежей головой потыкает в код?
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
&НаКлиенте
Функция ЧислоСимметричное(Число)
    ИсхЧисло = Число(Число);
    ПредварЧисло = Число(Число);
    ПеревернЧисло = 0;
    Пока ПредварЧисло <> 0 Цикл
        ПеревернЧисло = ПеревернЧисло * 10 + ПредварЧисло % 10;
        ПредварЧисло = Цел(ПредварЧисло / 10);
    КонецЦикла;
    
    Если ИсхЧисло = ПеревернЧисло Тогда
        Возврат Истина;
    Иначе
        Возврат Ложь; 
    КонецЕсли;
    
КонецФункции
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
&НаКлиенте
Процедура Задача3_14(Команда)
    
    ВхЧисло = Зад3_14Число;
    ВхЧисло = Строка(Формат(ВхЧисло, "ЧГ="));
    ПоследПозиция = СтрДлина(ВхЧисло);
    ПредпоследПозиция = СтрДлина(ВхЧисло) - 1;
    ДобавленныеЦифры = 0;   
    ИсхСтрока = ВхЧисло;
            
    Если НЕ ЧислоСимметричное(ВхЧисло) Тогда
        Пока ПредпоследПозиция >= 1 Цикл
            ИсхСтрока = ИсхСтрока + "" + Сред(Формат(ВхЧисло, "ЧГ="), ПредпоследПозиция, 1); //строим обратную цепочку
            ПредпоследПозиция = ПредпоследПозиция - 1;
            ДобавленныеЦифры = ДобавленныеЦифры + 1;
        КонецЦикла;
        Предупреждение("Полученное число: " + (ИсхСтрока) + Символы.ПС
            + "необходимо добавить: " + ДобавленныеЦифры + " цифр(ы)" + Символы.ПС
            + "добавленные цифры: " + Прав(ИсхСтрока, ДобавленныеЦифры));
    Иначе
        Предупреждение("Это число уже симметричное!");
    КонецЕсли; 
        
КонецПроцедуры
0
0 / 0 / 0
Регистрация: 08.05.2019
Сообщений: 14
12.05.2019, 13:24  [ТС]
P.S. Зад3_14Число - это реквизит на форме
Миниатюры
Какое минимальное количество приписать справа от числа, что бы число стало симметричным?  
0
6 / 4 / 2
Регистрация: 02.05.2019
Сообщений: 33
12.05.2019, 16:54
Привет. Я неправильно тебя (задание) понял. Теперь уже завтра поковыряюсь. Отпишусь.
0
0 / 0 / 0
Регистрация: 08.05.2019
Сообщений: 14
12.05.2019, 17:07  [ТС]
Denis_cfo, Добро. Спасибо
0
0 / 0 / 0
Регистрация: 08.05.2019
Сообщений: 14
14.05.2019, 21:09  [ТС]
Почти у цели. Пришел ответ от преподавателя. Цитата:
"Хорошо, но не до конца. Рассмотрим цепочку 12343 - ты просто дописываешь все числа слева и получаешь 12343(4321). Но ведь если дописать справа (21) то получится 12343(21) - тоже симметричное число. В условии сказано - какое МИНИМАЛЬНОЕ количество надо прибавить справа. 2 цифры меньше чем 4.
подсказка: при решении очень внимательно проверь числа, которые заканчиваются на 0."

Вот сижу и думаю, что имелось ввиду под подсказкой. Есть у кого мысли?)

Добавлено через 4 часа 34 минуты
Оказывается зря мудрил. Можешь кто в будущем будет гуглить на эту тему, решение оказалось очень простым)
Необходимо найти справа самый длинный кусок, который является палиндромом (симметричным) и дополнить оставшимися слева цифрами. Все! Функция проверки числа на симметричность и процедура модуля ниже.

Функция проверки числа на симметричность
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
&НаКлиенте
Функция ЧислоСимметричное(Число)
    ИсхЧисло = Число(Число);
    ПредварЧисло = Число(Число);
    ПеревернЧисло = 0;
    Пока ПредварЧисло <> 0 Цикл
        ПеревернЧисло = ПеревернЧисло * 10 + ПредварЧисло % 10;
        ПредварЧисло = Цел(ПредварЧисло / 10);
    КонецЦикла;
    
    Если ИсхЧисло = ПеревернЧисло Тогда
        Возврат Истина;
    Иначе
        Возврат Ложь; 
    КонецЕсли;
    
КонецФункции


Процедура задача
1C
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
&НаКлиенте
Процедура Задача(Команда)
    
    ВхЧисло = Зад3_14Число; // Реквизит на форме
    ВхЧисло = Строка(Формат(ВхЧисло, "ЧГ="));
    ИсхСтрока = ВхЧисло;
    ДлинаВхЧисл = СтрДлина(ВхЧисло);
    Сдвиг = 0;
    
    Если НЕ ЧислоСимметричное(ВхЧисло) Тогда
        Пока НЕ ЧислоСимметричное(ВхЧисло) Цикл
            Сдвиг = Сдвиг + 1;
            ВхЧисло = Прав(ВхЧисло, ДлинаВхЧисл - Сдвиг);
        КонецЦикла;
        ДобавленныеЦифры = Лев(ИсхСтрока, Сдвиг);
        ПеревернЧисло = 0;
        Пока ДобавленныеЦифры <> 0 Цикл
            ПеревернЧисло = ПеревернЧисло * 10 + ДобавленныеЦифры % 10;
            ДобавленныеЦифры = Цел(ДобавленныеЦифры / 10);
        КонецЦикла;
        ПеревернЧисло = Формат(ПеревернЧисло, "ЧГ=");
        ИсхСтрока = Число(ИсхСтрока + Строка(ПеревернЧисло));
        Предупреждение("Полученное число: " + Формат(ИсхСтрока, "ЧГ=") + Символы.ПС 
                      + "Цифр было добавлено: " + Сдвиг + Символы.ПС 
                      + "Добавленные цифры: " + ПеревернЧисло);
    Иначе
        Предупреждение("Это число уже симметричное!");
    КонецЕсли;
    
КонецПроцедуры
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2019, 21:09
Помогаю со студенческими работами здесь

Какое минимальное число букв необходимо заменить в слове X с тем, чтобы оно стало перевертышем?
Какое минимальное число букв необходимо заменить в слове X с тем, чтобы оно стало перевертышем? Нужен ещё вывод получившегося слова

Дано натуральное число n. Приписать по единице справа и слева от этого числа
Дано натуральное число n. Приписать по единице справа и слева от этого числа.

Подсчитайте, какое минимальное число букв необходимо заменить в слове X с тем, чтобы оно стало палиндромом?
Подсчитайте, какое минимальное число букв необходимо заменить в слове X с тем, чтобы оно стало палиндромом? И сделать так, чтобы в...

Какое минимальное количество цифр числа надо исправить, чтобы исправленное число совпадало с обращенным?
1.Составьте программу определяющую какое минимальное количество цифр числа H надо исправить,чтобы исправленное число совпадало с обращенным...

Найти все такие пары натуральных чисел a и b, что если число a возвести в квадрат и к полученному числу приписать справа
Найти все такие пары натуральных чисел a и b, что если число a возвести в квадрат и к полученному числу приписать справа десятичную запись...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru