Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

zdwork
Статус: 6-й класс
Рейтинг: 865
∙ повысить рейтинг »
solowey
Статус: Бакалавр
Рейтинг: 334
∙ повысить рейтинг »
CradleA
Статус: Профессор
Рейтинг: 65
∙ повысить рейтинг »

∙ С / С++

Номер выпуска:1971
Дата выхода:18.10.2019, 15:45
Администратор рассылки:Андрей Кузнецов aka Dr_Andrew (Старший модератор)
Подписчиков / экспертов:51 / 36
Вопросов / ответов:1 / 2

Консультация # 196608: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Напишите эффективную программу, находящуюи выводящую на экран все числа длины n являющиеся палиндромами. Понятно, что для четного n нужно записать все расстановки цифр 1..9 в количестве от 1 до n/2 (для нечетного до (n-1)/2), а потом их продублировать в обратном порядке, но как сделать э...

Консультация # 196608:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Напишите эффективную программу, находящуюи выводящую на экран все числа длины n являющиеся палиндромами.
Понятно, что для четного n нужно записать все расстановки цифр 1..9 в количестве от 1 до n/2 (для нечетного до (n-1)/2), а потом их продублировать в обратном порядке, но как сделать эту программу наиболее эффективной?

Заранее спасибо.

Дата отправки: 08.10.2019, 15:34
Вопрос задал: moonfox (Посетитель)
Всего ответов: 2
Страница онлайн-консультации »


Консультирует zdwork (6-й класс):

Здравствуйте, moonfox!
Вот код только для чисел...

// Проверка введеного числа на полиндром
#include <cstdlib>
#include <iostream>

using namespace std;

int isPal(int n)
{
int p,k,m;
k=0;
m=n;
while(m > 0)
{
p=m % 10;
m=m/10;
k=k*10+p;
}
return (n==k);
}

int main(int argc, char *argv[])
{
int n;
cout << "n=";
cin >> n;
isPal(n)?cout << "yes":cout << "no";
cout << endl;

system("PAUSE");
return EXIT_SUCCESS;
}

Сл-щие для символов, т.е. как для чисел, так и слов...

1.
// Проверка введеных символов на полиндром
#include <iostream>
#include <algorithm>
#include <string>
#include <locale>

using namespace std;
bool is_Palindrome(const string& w)
{
return equal(w.begin(), w.end(), w.rbegin());
}

int main()
{
setlocale(LC_ALL,"Russian");
cout << "введите число (или слово)" << endl;
string w;
cin >> w;
if(is_Palindrome(w))
cout << w << " - палиндром";
else
cout << w << " - не палиндром";
system("PAUSE");
return 0;
}

2.
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <locale>
using namespace std;

bool check_polindrom(string word)
{
int len = word.length();
for(int i = 0; i < len/2; ++i)
{
if(word[i] != word[len-i-1])
{
return false;
}
}
return true;
}

int main()
{
setlocale(LC_ALL,"Russian");
string str;
cout << "введите число (или слово)";
cin >> str ;
if(check_polindrom(str))
{
cout << str << " - палиндром." << endl;
}
else
{
cout << str << " - не палиндром" << endl;
}
system("PAUSE");
return 0;
}
А, какой из них более рациональный или "наиболее эффективный?" решай сам или кто там...

Консультировал: zdwork (6-й класс)
Дата отправки: 08.10.2019, 22:36

3
Спасибо конечно, но нужно было вывести все палиндромы длиной n, а не проверять, является ли n палиндромом или нет.
-----
Дата оценки: 08.10.2019, 23:12

Рейтинг ответа:

НЕ одобряю +1 одобряю!


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, moonfox!
Держите решение... smile
Идея: перебираем ВСЕ цифры первой половины, затем выводим сначала первую половину, затем вторую.
Учитывается четное/нечетное количество цифр
Для перебора всех цифр использован рекурсивный вызов получения очередной цифры.
Для хранения очередных цифр использован массив из 100 значений, т.е. нельзя искать полиндромы более 201 цифры smile
Этот момент легко меняется: зная n, можно получить требуемый массив динамически... smile Программа демонстрирует идею...
Рекомендую изучить код, чтобы понять, как можно организовать неизвестное заранее количество вложенных циклов... smile smile

#include <iostream>
using namespace std;

int ind[100];	//здесь будем хранить цифры, ограничимся числами до 201 цифр

void palindrom(int n, int t) //n - всего цифр, t - позиция формирования
{
	int m = (n >> 1) + (n & 1); //количество цифр слева. Для нечетного - включаем и центральную

	if (t == m)	//полный набор?
	{
		if (ind[0] != 0)	//первые нули игнорируем
		{
			for (int i = 0; i < m; i++)	//левая половина
				cout << ind[i] << " ";
			for (int i = (n & 1) ? m - 2 : m - 1; i >= 0; i--) //правая половина
				cout << ind[i] << " ";
			cout << endl;
		}
		return;
	}
	for (int i = 0; i < 10; i++)	//перебираем цифры
	{
		ind[t] = i;					//на t позиции
		palindrom(n, t + 1);		//форируем рекурсивно дальше!
	}
}

int main() {
	int n;		//общее число цифр
	cin >> n;
	palindrom(n, 0);
	system("pause");
	return 0;
}


Небольшая модификация программки:
#include <iostream>
using namespace std;

int *ind = NULL;	//здесь будем хранить цифры
int m;
int r;

void palindrom(int t) //t - позиция формирования
{
	if (t == m)	//полный набор?
	{
		if (ind[0] != 0)	//первые нули игнорируем
		{
			for (int i = 0; i < m; i++)	//левая половина
				cout << ind[i] << " ";
			for (int i = r ; i >= 0; i--) //правая половина
				cout << ind[i] << " ";
			cout << endl;
		}
		return;
	}
	for (int i = 0; i < 10; i++)	//перебираем цифры
	{
		ind[t] = i;					//на t позиции
		palindrom(t + 1);		//форируем рекурсивно дальше!
	}
}

int main() {
	int n;		//общее число цифр
	cin >> n;
	m = (n >> 1) + (n & 1); //количество цифр слева. Для нечетного - включаем и центральную
	r = (n & 1) ? m - 2 : m - 1;
	ind = new int[m];
	palindrom(0);
	delete[] ind;
	system("pause");
	return 0;
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 11.10.2019, 15:27
Рейтинг ответа:

НЕ одобряю +2 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное