Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
OffSide
2 / 2 / 0
Регистрация: 03.10.2010
Сообщений: 111
#1

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

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

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

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

Добавлено через 20 минут
сижу на экзамене! помогите
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2011, 10:34     Найти отрезок массива-палиндром, в котором первое число равно последнему, второе предпоследнему и т.д.
Посмотрите здесь:
Найдите отрезок массива, в котором первое число равно последнему, второе - предпоследнему и так далее C++
C++ В массиве найти отрезок максимальной длины, в котором первое число равно последнему, второе - предпоследнему и т.д. Напечатать характеристики этого от
C++ Цикл: Найти первое нечетное и второе четное избыточное число
Как найти, сколько раз надо взять первое и второе число, чтобы получить третье C++
Введенное число делить на второе введенное число пока первое число не станет равным нулю C++
Найти сумму и число тех элементов массива, которые попадают на заданный отрезок C++
C++ Найти сумму и число тех элементов заданного массива X1,X2, … ,Xn, которые попадают на заданный отрезок.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 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);    
}
igorrr37
1641 / 1269 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
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<<"  ";});
}
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 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);    
}
Saboth
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());
}
//---------------------------------------------------------------------------
OffSide
2 / 2 / 0
Регистрация: 03.10.2010
Сообщений: 111
20.01.2011, 14:29  [ТС]     Найти отрезок массива-палиндром, в котором первое число равно последнему, второе предпоследнему и т.д. #6
эх... зарядки ноута не хватило))) как раз немного позже вы и выложили...
сдал на 3... смог решить только пол задачи, написал. как найти 2 одинаковых в массиве, и еще немного оставалось)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2011, 18:42     Найти отрезок массива-палиндром, в котором первое число равно последнему, второе предпоследнему и т.д.
Еще ссылки по теме:
C++ Найти сумму и число тех элементов заданного массива, которые попадают на заданный отрезок
C++ Определить, равно ли число (двумерного массива) нулю. Если равно, то вместо нуля записываем указанный символ
C++ Заменить первое число нулем, если оно меньше или равно второму
C++ Заменить первое число нулем, если оно меньше или равно второму
Некоторое число оканчивается на 2. Если же эту его последнюю цифру переставить на первое место, то число удвоится. Найти это число C++

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

Или воспользуйтесь поиском по форуму:
Robinzo_ON
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
03.05.2011, 18:42     Найти отрезок массива-палиндром, в котором первое число равно последнему, второе предпоследнему и т.д. #7
А на C# такую может кто-нибудь перевести?
Yandex
Объявления
03.05.2011, 18:42     Найти отрезок массива-палиндром, в котором первое число равно последнему, второе предпоследнему и т.д.
Ответ Создать тему
Опции темы

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