С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

Добавлено через 20 минут
сижу на экзамене! помогите
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2011, 10:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти отрезок массива-палиндром, в котором первое число равно последнему, второе предпоследнему и т.д. (C++):

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

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

Цикл: Найти первое нечетное и второе четное избыточное число - C++
ребят помогите пожалуйста решить задачу Найти первое нечетное и второе четное избыточное число (избыточное число - положительное...

Как найти, сколько раз надо взять первое и второе число, чтобы получить третье - C++
Как найти сколько раз надо взять первое и второе число что-бы получить третье (Все варианты найти) Числа могут быть большими так-что...

Если первое число окажется кратным 5 или второе число будет нечетным, то вывести на экран сумму их модулей - C++
4. Даны два числа N и М. Если первое число окажется кратным 5 или второе число будет нечетным, то вывести на экран сумму модулей заданных...

Введенное число делить на второе введенное число пока первое число не станет равным нулю - C++
Введенное число делить на второе введенное число пока первое число не станет равным int number=0; int secondNum=0; int...

6
Mr.X
Эксперт С++
3051 / 1696 / 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);    
}
1
igorrr37
1648 / 1276 / 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<<"  ";});
}
1
Mr.X
Эксперт С++
3051 / 1696 / 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);    
}
1
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());
}
//---------------------------------------------------------------------------
0
OffSide
2 / 2 / 0
Регистрация: 03.10.2010
Сообщений: 111
20.01.2011, 14:29  [ТС] #6
эх... зарядки ноута не хватило))) как раз немного позже вы и выложили...
сдал на 3... смог решить только пол задачи, написал. как найти 2 одинаковых в массиве, и еще немного оставалось)
0
Robinzo_ON
0 / 0 / 0
Регистрация: 18.04.2011
Сообщений: 11
03.05.2011, 18:42 #7
А на C# такую может кто-нибудь перевести?
0
03.05.2011, 18:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2011, 18:42
Привет! Вот еще темы с ответами:

Найти сумму и число тех элементов массива, которые попадают на заданный отрезок - C++
Помогите написать программу по теме: одномерные массивы. Найти сумму и число тех элементов заданного массива X1,X2, … ,Xn, которые...

Найти сумму и число тех элементов заданного массива X1,X2, … ,Xn, которые попадают на заданный отрезок. - C++
1. чНайти сумму и число тех элементов заданного массива X1,X2, … ,Xn, которые попадают на заданный отрезок.

Найти сумму и число тех элементов заданного массива, которые попадают на заданный отрезок - C++
Помогите с задачей. Программа на С++. Можно как-нибудь по-проще... Все данные должны вводиться с клавиатуры. Найти сумму и число тех...

Определить, равно ли число (двумерного массива) нулю. Если равно, то вместо нуля записываем указанный символ - C++
Вот что нужно написать кодом: сравнить, равно ли число (двумерного массива) нулю. Если равно, то вместо нуля записываем, например,...


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

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

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