Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 1
Регистрация: 03.10.2010
Сообщений: 111
1

Найти отрезок массива-палиндром, в котором первое число равно последнему, второе предпоследнему и т.д.

20.01.2011, 10:34. Просмотров 1973. Ответов 6
Метки нет (Все метки)

Перевертыши. Дан числовой массив А[1...n]. Найти отрезок массива максимальной длины, в котором первое число равно последнему, второе предпоследнему и т.д. Определить длину и вывести элементы найденного отрезка на экран. на борланде

Добавлено через 23 минуты
пацаны помогите

Добавлено через 20 минут
сижу на экзамене! помогите
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2011, 10:34
Ответы с готовыми решениями:

Найдите отрезок массива, в котором первое число равно последнему, второе - предпоследнему и так далее
Задание: Задан числовой массив A(M). Найдите отрезок массива, в котором первое число равно...

В массиве найти отрезок максимальной длины, в котором первое число равно последнему, второе - предпоследнему и т.д. Напечатать характеристики этого от
Помогите ребят!!!!препод задачи задачи для аттестации,сделал фактически все,кроме этой: "В массиве...

Найти отрезок массива максимальной длины, в котором первое число равно последнему, второе предпоследнему и т.д.
Задан числовой массив A. Найти отрезок массива максимальной длины, в котором первое число равно...

Найдите отрезок максимальной длины, в котором первое число равно последнему, второе — предпоследнему
Задан числовой массив длины N . Найдите отрезок максимальной длины, в котором первое число равно...

6
Эксперт С++
3204 / 1731 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
20.01.2011, 11:31 2
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//////////////////////////////////////////////////////////////////////////////////////
//Перевертыши. Дан числовой массив А[1...n]. Найти отрезок массива максимальной длины, 
//в котором первое число равно последнему, второе предпоследнему и т.д. 
//Определить длину и вывести элементы найденного отрезка на экран. на борланде
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////////
typedef int                 T_num;
typedef std::vector<T_num>  T_nums;
typedef std::string         T_str;
//////////////////////////////////////////////////////////////////////////////////////
void  get_max_palindrom
    (
        int            i, 
        const T_nums&  nums, 
        int&           len, 
        int&           i_beg, 
        int&           i_end
    )
{
    int  len_max_cur  = -1;
    int  i_beg_cur    = -1; 
    int  i_end_cur    = -1;
 
    if(   i < int(nums.size() - 1 - 2)
       && nums[i] == nums[i + 2])
    {
        int k = 1;
        do
        {
            ++k;
        }while(   i + 1 - k >= 0
               && i + 1 + k < nums.size()
               && nums[i + 1 - k] == nums[i + 1 + k]);
        
        int  len_cur = 2 * --k + 1;
        if(   len_max_cur == -1
           || len_cur > len_max_cur)
        {
            len_max_cur = len_cur;
            i_beg_cur   = i + 1 - k;
            i_end_cur   = i + 1 + k + 1;
        }
    }
 
    if(
          i < int(nums.size() - 1 - 3)
       && nums[i]      == nums[i + 3]
       && nums[i + 1]  == nums[i + 2]
      )
    {
        int k = 1;
        do
        {
            ++k;
        }while(   i + 1 - k >= 0
               && i + 2 + k < nums.size()
               && nums[i + 1 - k] == nums[i + 2 + k]);
        
        int  len_cur = 2 * (--k + 1);
        if(   len_max_cur == -1
           || len_cur > len_max_cur)
        {
            len_max_cur = len_cur;            
            i_beg_cur   = i + 1 - k;
            i_end_cur   = i + 2 + k + 1;
        }
    }
    len    = len_max_cur;
    i_beg  = i_beg_cur;
    i_end  = i_end_cur;
}
//////////////////////////////////////////////////////////////////////////////////////
void  print_max_palindrom(const T_nums&  nums)
{
    int  len_max    = -1;
    int  i_max_beg  = -1;
    int  i_max_end  = -1;
 
    for(size_t  i = 0; i < nums.size(); ++i)
    {
        int  len    = -1;
        int  i_beg  = -1;
        int  i_end  = -1;
        get_max_palindrom(i, nums, len, i_beg, i_end);
        if(len > len_max)
        {
            i_max_beg = i_beg;
            i_max_end = i_end;
        }
    }
 
    if(   i_max_beg != -1
       && i_max_end != -1)
    {
        std::cout << "Максимальный палиндром в этом массиве:"
                  << std::endl;
        std::copy(nums.begin() + i_max_beg, nums.begin() + i_max_end, 
                  std::ostream_iterator<T_num>(std::cout, "\t"));
        std::cout << std::endl;
    }
    else
    {
        std::cout << "В заданном массиве нет палиндромов."
                  << std::endl;
    }
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));   
    srand(static_cast<unsigned>(time(0)));  
    const int VECT_SIZE = 30;
    struct  T_gen_with_mod
    {
        const T_num MOD_;
        //-----------------------------------------------------------------------------
        T_gen_with_mod(T_num mod) : MOD_(mod)
        {}
        //-----------------------------------------------------------------------------
        T_num  operator() ()
        {
            return  rand() % MOD_;
        }
    };
 
    T_nums  nums;
    std::generate_n(std::back_inserter(nums), VECT_SIZE, T_gen_with_mod(VECT_SIZE));
 
    std::copy(nums.begin(), nums.end(), 
              std::ostream_iterator<T_nums::value_type>(std::cout, "\t"));
 
 
    print_max_palindrom(nums);    
}
1
2123 / 1661 / 828
Регистрация: 21.12.2010
Сообщений: 2,949
Записей в блоге: 12
20.01.2011, 11:51 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
int main(){
    vector<int> v, temp, res;
    int x;
    while(cin>>x) v.push_back(x);
    for(auto it=v.begin(); it!=v.end(); ++it){
        for(auto ir=v.end(); ir!=it; --ir){
            reverse_copy(it, ir, back_inserter(temp));
            if(equal(it, ir, temp.begin())&&temp.size()>res.size()){
                res=temp;
            }
            temp.clear();
        }
    }
    cout<<"\n\nlength= "<<res.size()<<"\n\n";
    for_each(res.begin(), res.end(), [](int x){cout<<x<<"  ";});
}
1
Эксперт С++
3204 / 1731 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
20.01.2011, 13:22 4
Да, ежели попроще, то еще вот так можно:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//////////////////////////////////////////////////////////////////////////////////////
//Перевертыши. Дан числовой массив А[1...n]. Найти отрезок массива максимальной длины, 
//в котором первое число равно последнему, второе предпоследнему и т.д. 
//Определить длину и вывести элементы найденного отрезка на экран. на борланде
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////////
typedef int                 T_num;
typedef std::vector<T_num>  T_nums;
//////////////////////////////////////////////////////////////////////////////////////
bool  is_palindrom(const T_nums&  nums)
{
    return  std::equal(nums.begin(), nums.end(), nums.rbegin());
}
//////////////////////////////////////////////////////////////////////////////////////
void  print_max_palindrom(const T_nums&  nums)
{
    T_nums  max_palindrom;
    for(size_t  i = 0; i < nums.size(); ++i)
    {        
        for(size_t  j = nums.size() - 1; j > i + max_palindrom.size(); --j)
        {            
            T_nums  subvect_cur(nums.begin() + i, nums.begin() + j);
            if(is_palindrom(subvect_cur))               
            {
                max_palindrom = subvect_cur;
            }        
        }    
    }
    
    std::cout << "Максимальный палиндром длиной "
              << max_palindrom.size()
              << " имеет вид: "
              << std::endl;
 
    std::copy(max_palindrom.begin(), max_palindrom.end(), 
              std::ostream_iterator<T_nums::value_type>(std::cout, "\t"));    
    
    std::cout << std::endl;
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));   
    srand(static_cast<unsigned>(time(0)));  
    const int VECT_SIZE = 30;
    struct  T_gen_with_mod
    {
        const T_num MOD_;
        //-----------------------------------------------------------------------------
        T_gen_with_mod(T_num mod) : MOD_(mod)
        {}
        //-----------------------------------------------------------------------------
        T_num  operator() ()
        {
            return  rand() % MOD_;
        }
    };
 
    T_nums  nums;
    std::generate_n(std::back_inserter(nums), VECT_SIZE, T_gen_with_mod(VECT_SIZE));
 
    std::copy(nums.begin(), nums.end(), 
              std::ostream_iterator<T_nums::value_type>(std::cout, "\t"));
 
    print_max_palindrom(nums);    
}
1
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 29
20.01.2011, 13:32 5
Цитата Сообщение от OffSide Посмотреть сообщение
...на борланде
Это чудесно, только Borland - это фирма, у них куча всяких оболочек.

Вот VCL-версия, под BDS (Borland Developer Studio), я думаю и на Builder покатит, ну максимум расширение библиотек убрать/поставить.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//на форме:
//Button1 - "Выполнить"
//Button3 - "Добавить"
//Edit2 - поле добавления чисел
//Memo1 - отображает весь массив
//Memo2 - отображает найденную область
//$$---- Form CPP ----
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <vector.h>
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int sizeArr2;
int i;
int inc=1, dec=0;
int startPos;
int endPos;
int varMass[2][2];
vector <int> mass;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
inc=1;
dec=0;
Memo1->Lines->Clear();
 
sizeArr2=mass.size();
 
for(i=0;i<sizeArr2;i++)
{
 Memo1->Lines->Add(mass[i]);
}
 
for(i=0;i<sizeArr2;i++)
{
 l1:
 if(mass[i+dec]==mass[i+inc])
 {
  startPos=i+dec;
  endPos=i+inc;
  varMass[1][0]=startPos;
  varMass[1][1]=(endPos-startPos)+2;
 
  dec--;
  inc++;
 
  if(varMass[0][1]<varMass[1][1])
  {
   varMass[0][0]=varMass[1][0];
   varMass[0][1]=varMass[1][1];
  }
  goto l1;
 }
 else
 {
  inc=1;
  dec=0;
 }
}
 
for(i=varMass[0][0];i<(varMass[0][0]+varMass[0][1]-1);i++)
{
 Memo2->Lines->Add(mass[i]);
}
Form1->Caption=varMass[0][1]-1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
varMass[0][0]=0;
varMass[0][1]=0;    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
mass.push_back(Edit2->Text.ToInt());
Memo1->Lines->Add(Edit2->Text.ToInt());
}
//---------------------------------------------------------------------------
0
2 / 2 / 1
Регистрация: 03.10.2010
Сообщений: 111
20.01.2011, 14:29  [ТС] 6
эх... зарядки ноута не хватило))) как раз немного позже вы и выложили...
сдал на 3... смог решить только пол задачи, написал. как найти 2 одинаковых в массиве, и еще немного оставалось)
0
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
03.05.2011, 18:42 7
А на C# такую может кто-нибудь перевести?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2011, 18:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

В массиве найти отрезок максимальной длины, в котором первое число равно последнему
дан массив в массиве а найти отрезок максимальной длины в котором первое число равно последнему...

Числа Люка определяются так: первое число равно 1, второе равно 3, каждое следующее равно сумме двух предыдущих. Состави
Задание Числа Люка определяются так: первое число равно 1, второе равно 3, каждое следующее равно...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.