Text: |
ФІО = Горбаченко В.А.
Запитання://---------------------------------------------------------------------------
#pragma hdrstop
#include <iostream>
/*
AK p01 z02
Задано числовий масив A[m]. Знайти відрізок масиву максимальної довжини, в якому перше
число дорівнює останньому, друге передостанньому тощо. Надрукувати довжину цього
відрізку. Програму написати з використанням виразів над вказівниками.
*/
#include <stdio.h>
#include <conio.h>
// розміри масиву
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
int GetMaxSymLength(int *A,int p,int n)
// повертає максимальну довжину симметрії.
// приймає вказівник на масив, індекс початку, кількість елементів послідовності.
// повертає 0 - якшо не симметрично
{
for (int i = 0 ; i <= n/2 ; i++)
{
if ( *(A+p+i) != *(A+p+n-i) ) return 0;
}
return n+1;
}
int main(int argc, char* argv[])
{
int M;
do{
cout<<"Matrix\n Enter M = ";
cin>>M;
if (M<=0) cout<<"ERROR : M > 0 !\n";
}while (M<=0); // не даємо вийти, поки не буде введено m>0
int *A = new int [M];
for (int i = 0 ; i < M ; i++ )
{
cout<<"a ["<<i<<"] = ";
cin>>(*(A+i));
}
int p1 = -1, p2 = -1, length = 0; // позиція початку та кінця та довжина того, що шукаємо
// врахуємо те, що послідовностей з однаковими довжинами може бути декілька
int count_rep = 0;
for ( int i = 0 ; i < M; i++ )
{ // пошук повторень
for ( int j = 1 ; j < M - i ; j++ )
{
// cout<<(*(A+i+j) )<<" ";
if (*(A+i) == *(A+i+j))
{
int maybemax = GetMaxSymLength(A,i,j);
if (maybemax>length)
{
length = maybemax;
p1 = i;
p2 = i + j+1;
count_rep++;
}
if (maybemax==length) count_rep++;
}
}
// cout<<endl;
}
cout<<"LENGTH is "<<length<<endl;
// ЦІ СТРОКИ ЗАЙВІ, АЛЕ КРАСИВО ПРАЦЮЄ (виводить те, співпадіння в квадратних скобках)
if (count_rep == 1)
{
for ( int i = 0 ; i < M ; i++ )
{ // вивід масиву
if (length!=0 && i== p1) cout<<" [";
cout<< (*(A+i)) <<" ";
if (length!=0 && i== p2) cout<<"] ";
}
}
else
{
for ( int i = 0 ; i < M; i++ )
{
for ( int j = 1 ; j < M - i ; j++ )
{
if (*(A+i) == *(A+i+j))
{
int maybemax = GetMaxSymLength(A,i,j);
if (maybemax==length)
{
p1 = i;
p2 = i + j;
for ( int z = 0 ; z < M ; z++ )
{ // вивід масиву
if (length!=0 && z== p1) cout<<"[ ";
cout<< (*(A+z)) <<" ";
if (length!=0 && z== p2) cout<<"] ";
}
cout<<endl;
}
}
}
}
}
// END OF ЦІ СТРОКИ ЗАЙВІ, АЛЕ КРАСИВО ПРАЦЮЄ
cout<<endl;
cout<<endl;
delete []A;
system("PAUSE");
}
//---------------------------------------------------------------------------
====================================
|