#include <iostream>
using namespace std;
//Для задания непрямоугольной матрицы
struct Line{
int n;
double *ar;
Line *matr;
};
//Функция ввода
istream&input(int&a){
while(!(cin>>a)){
if(cin.eof())
break;
cin.clear();
cin.ignore();
}
return cin;
}
//Ввод количества строк
int input(){
int n;
const char*pr="";
do{
cout<<pr<<endl;
pr="error!!!";
cout<<"enter number of int:";
input(n);
}while(n<=0);
return n;
}
//Ввод матрицы
int input(Line*&p){
int m=input();
p=new Line[m];
for(int i=0;i<m;++i){
p[i].n=input();
p[i].ar=new double[p[i].n];
for(int j=0;j<p[i].n,++j)
input(p[i].ar[j]);
}
return m;
}
//Это я начал что-то с выводом предполагать
void output(Line*&p){
for(int i=0;i<m;++i){
for(int j=0;j<p[i].n;++j)
cout<<p[i].n<<endl;
}
int main(){
//Переворот строки
void reverse (char *from, char *to){
int i=strlen(from);
strcpy(to,"");
while(i -->0)
strncat(to,&from[i],1);
}
//Отвечает, палиндром или нет
int isapal(char *str){
char tmp1[80],tmp2[80];
strcpy(tmp1,str);
compress(str,tmp1);
reverse (tmp1,tmp2);
return !strcmp(tmp1,tmp2);
}
BOOL IsPal(Line &line)
{
int n = line.n;
for(int i=0; i<n; i++)
{
if(line.ar[i] != line.ar[n-i-1])
return FALSE;
}
return TRUE;
}
Осталось разобраться с палиндромами. Последняя функция действительно работает только со строками.
Числа в десятичной записи тоже могут быть палиндромами, но тогда их надо переводить в строковый вид
поместив в её i-ю строку элементы из i-й строки исходной матрицы, являющиеся палиндромами.
У тебя уже есть решение. Смотри, у тебя первая матрица вводится в цикле, из потока. Надо просто поток убрать и сделать своё добавление элементов. Чисто программерский подход
Вы говорите матрица целых чисел, а функция определения палиндрома для строк. Числа в десятичной записи тоже могут быть палиндромами, но тогда их надо переводить в строковый вид.
Или Вы про вывод?
void output(Line*&p){
for(int i=0;i<m;++i){
if(IsPal(p[i])){
for(int j=0;j<p[i].n;++j)
cout<<p[i].n<<endl;
}
else{
continue;
}
}
Только я и тут не понял, как количество элементов строки посчитать, если они из потока вводятся...
Сформировать новую матрицу, поместив в её i-ю строку элементы из i-й строки исходной матрицы, являющиеся палиндромами.
Кстати, какая версия про палиндромичность правильная? 21 1 12 или 21 1 21? Если вторая, то моя функция подойдёт для определения, т.е. как вот выше в примере уже написал.
//что где в коде:
const int n=10,m=10,k=100;//размерность
int a[ n ][ m ];//матрица проверямых чисел
int b;//индекс контроля палиндрома, текущее число
int c[ k ];//массив остатков
int d;//индекс контроля палиндрома, счетчик цифр остатка от деления
bool e;//флаг контроля
int i,j;//индексы матрицы
//
//цикл проверки
i=0;//индекс строк матрицы
while( i<n )
{
j=n;//индекс столбцов матрицы
d=0;//счетчик цифр остатка от деления
e=true;//флаг контроля
//
while( j>=0 )
{
b=a[ i ][ --j ];//текущее проверяемое число и следующий столбец
while( b>0 )
{
c[ d++ ]=b % 10;//запоминаем остаток от деления
b/=10;//исключаем остаток
}
}
//
//b=0; // не нужно, т.к. выход из предыдущего цикла по В=0
while( b<d && e )
//
e=c[ b++ ]==c[ --d ]; проверка
//
//Если Е= истина, копируете строку в в другую матрицу, свободные индексы b, d ,j/
i++;//следующая строка матрицы
}
#include<iostream>
#include <vector>
#include <iomanip>
using namespace std;
bool is_pali(int n)
{
vector<int> v;
while (n>0)
{
v.push_back(n%10);
n/=10;
}
size_t i=0;
size_t j=v.size()-1;
while (i<j && v[i]==v[j])
{
++i;
--j;
}
return i>=j;
}
int main()
{
size_t m;
cin>>m;
vector <vector <int> >mat1(m);
for (size_t i=0; i!=m; ++i)
{
size_t n;
cin>>n;
for (size_t j=0; j!=n; ++j)
{
int x;
cin >> x;
mat1[i].push_back(x);
}
}
vector <vector <int> >mat2(m);
for (size_t i=0; i!=m; ++i)
{
size_t n = mat1[i].size();
for (size_t j=0; j!=n; ++j)
if (is_pali(mat1[i][j]))
mat2[i].push_back(mat1[i][j]);
}
for (size_t i=0; i!=mat2.size(); ++i)
{
cout << "i=" << i << "=>" ;
for (size_t j=0; j!=mat2[i].size(); ++j)
cout << setw(6) << mat2[i][j];
cout << endl;
}
return 0;
}
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
bool is_pali(const int n)
// Является ли число палиндромом?
{
int x=n; // сохраняем передаваемое число во временную переменную
int m=0; // формируем "перевернутое" число
while (x>0) // есть что добавлять?
{
m=m*10+x%10; // по формуле Горнера, но только справа налево
x/=10; // получем остаток после "отсечения" правой цифры
}
return m==n; // "перевенутое" число равно исходному?
}
int main()
{
size_t m;
cin>>m; // количество строк
vector <vector <int> >mat1(m); // матрица
for (size_t i=0; i!=m; ++i)
{
size_t n;
cin>>n; // количество столбцов
for (size_t j=0; j!=n; ++j)
{
int x;
cin >> x;
mat1[i].push_back(x); // увеличиваем размер строки, добавляя элемент
}
}
vector <vector <int> >mat2(m); // результирующая матрица
for (size_t i=0; i!=m; ++i)
{
size_t n = mat1[i].size();
for (size_t j=0; j!=n; ++j)
if (is_pali(mat1[i][j])) // если соответствующий элемент i-й строки 1й матрицы - палиндром
mat2[i].push_back(mat1[i][j]); // добавим его к i- строке 2й мартицы
}
for (size_t i=0; i!=mat2.size(); ++i) // печать 2й матрицы
{
cout << "i=" << i << "=>" ;
for (size_t j=0; j!=mat2[i].size(); ++j)
cout << setw(6) << mat2[i][j];
cout << endl;
}
return 0;
}
3
4
12 123 121 1221
2
11 11
4
121 121 212 2112
i=0=> 121 1221
i=1=> 11 11
i=2=> 121 121 212 2112
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.