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

Пилообразная последовательность - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
Tattoquardas
0 / 0 / 0
Регистрация: 22.10.2011
Сообщений: 21
23.09.2012, 01:51     Пилообразная последовательность #1
Последовательность a1, a2, a3, … , an-1, an называется пилообразной, если она
удовлетворяет одному из следующих условий:
1) a1 < a2 > a3 < … > an-1 < an
2) a1 > a2 < a3 > … < an-1 > an
Дана числовая последовательность. Требуется определить длину самой
длинной ее пилообразной непрерывной подпоследовательности.
при первом условии работает нормально, при втором - нет. Помогите найти ошибку!

Вот код, написан мной:

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
#include <iostream>
using namespace std;
 
int main() {
    cout<<"Enter the number of elements: ";
    int n;
    cin>>n;
    cout<<"Enter the elements: "<<endl;
    int arr[n];
    int p=0;
    while (p!=n) {
          cin>>arr[p];
          p++;
          }
    int m=0;
    int i=0;
    int len=0;
    while (i!=n){
          if (((arr[i]>arr[i+1])&&(arr[i]>arr[i-1]))||((arr[i]<arr[i+1])&&(arr[i]<arr[i-1]))){
             m++;
             if (len<m) {len=m;}
             i++;
             cout<<m<<endl;
             }
          else {
               m=0;
               i++;
               }
          }
          cout<<"The length of the longest chain: "<<len<<endl;
          system("pause");
          return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2012, 01:51     Пилообразная последовательность
Посмотрите здесь:

Преобразовать литерную последовательность в другую литерную последовательность всеми описанными ниже способами C++
Вводится последовательность из N целых чисел. Сформировать последовательность, C++
C++ Вводить последовательность вещественных чисел, пока следующее вводимое число не окажется меньше предыдущего. Вывести полученую последовательность.
Вводится последовательность целых чисел,0 –конец последовательности. Определить, содержит ли последовательность хотя бы три отрицательных четных числа C++
C++ Дана последовательность, элементы которой есть целые двузначные числа. Упорядочить последовательность по убыванию произведений цифр
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cmath
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
23.09.2012, 03:55     Пилообразная последовательность #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
#include <iostream>
using namespace std;
 
int main() 
{
      setlocale(LC_ALL, "Russian"); // используйте для работы с символами русского алфавита
 
      cout<< "Введите количество элементов: ";
      int n;
      cin >> n;
 
      cout<< "Введите элементы: " << endl;
 
      int arr[n];
      int p = 0;
 
      while (p != n) 
      {
               cin >> arr[p];
               p++;
      }
 
      int m = 0;
      int i = 0;
      int len = 0;
 
      while (i != n)
      {
               if ( ((arr[i] > arr[i+1]) && (arr[i] > arr[i-1])) || 
                    ((arr[i] < arr[i+1]) && (arr[i] < arr[i-1]))        
                  )
               {
                     m++;
                     if (len < m) {len = m;}
                     i++;
                     cout << m << endl;
               }
               else 
               {
                     m=0;
                     i++;
               }
      }
 
      cout << "Длина самой длинной подпоследовательности: " << len << endl;
      system("pause");
      return 0;
}
Вот, переписал с тегами. Можно и разбирать начать.

Добавлено через 12 минут
Теперь, собственно, по вашему коду (считаю ввод корректным):
Вы проверяете оба условия в одном условном операторе! Разве это верно? Если я правильно понял, то она (подпоследовательность) не может одновременно удовлетворять обоим условиям сразу. Это и есть ошибка. Кроме этого:
Цитата Сообщение от Hydrogen Посмотреть сообщение
C++
1
cout << m << endl;
это вам зачем? Хоть это и не так критично, как предыдущее, сие не есть хорошо.

Добавлено через 2 минуты

Не по теме:

З.Ы. теги юзайте! Правильное оформление задачи сильно поможет человеку, который в ней будет разбираться

Tattoquardas
0 / 0 / 0
Регистрация: 22.10.2011
Сообщений: 21
23.09.2012, 22:52  [ТС]     Пилообразная последовательность #3
даже если проверять по отдельности , все равно не работает. первое условие - нормально, второе - с ошибками...
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
23.09.2012, 23:21     Пилообразная последовательность #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
#include <iostream>
 using namespace std;
 
 int main() {
 cout<<"Enter the number of elements: ";
 int n;
 cin>>n;
 cout<<"Enter the elements: "<<endl;
 int arr[n];
 int p=0;
 while (p!=n) {
 cin>>arr[p];
 p++;
 }
 int m=0;
 int i=1;
 int len=-2;
 while (i<n-1){
 if (((arr[i]>arr[i+1])&&(arr[i]>arr[i-1]))||((arr[i]<arr[i+1])&&(arr[i]<arr[i-1]))){
 m++;
 if (len<m) {len=m;}
 i++;
 //cout<<m<<endl;
 }
 else {
 m=0;
 i++;
 }
 }
 cout<<"The length of the longest chain: "<<len+2<<endl;
 system("pause");
 return 0;
 }
cmath
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
24.09.2012, 03:47     Пилообразная последовательность #5
Цитата Сообщение от Tattoquardas Посмотреть сообщение
даже если проверять по отдельности , все равно не работает. первое условие - нормально, второе - с ошибками...
Надо начинать проверку не с первого (в смысле нулевого) элемента, а со второго (индекс i=1). Когда вы пишите, что a[i]<a[i-1] при нуле ерунда получается. Кроме того, у вас элементов n, а не n+1

Цитата Сообщение от valeriikozlov Посмотреть сообщение
int len=-2;
valeriikozlov,
З.Ы. Tattoquardas, короч используйте код valeriikozlov. Сие очень верное решение (особенно с len=-2, сам проглядел, что длину неправильно ваша ,Tattoquardas, программа считает)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
24.09.2012, 06:47     Пилообразная последовательность #6
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
#include <iostream>
 
 
bool less( const int a, const int b ) {
   return a < b;
}
bool larger( const int a, const int b ) {
   return a > b;
}
 
int main() {
   bool ( *cmp[ 2 ] )( const int, const int ) = { less, larger };
   bool currentCmp; 
   std::size_t size = 10,
               max = 2,
               current = 2;
   
   int *arr = new int [ size ];
   
   for ( std::size_t i = 0; i < size; i++ )
      std::cout << ( arr[ i ] = std::rand() % size ) << ' ';
      
   std::cout << std::endl;
   
   currentCmp = arr[ 0 ] < arr[ 1 ];
   
   for ( std::size_t i = 2; i < size; i++ ) {
      if (( *cmp[ currentCmp ])( arr[ i - 1 ], arr[ i ])) {
         current++;
         currentCmp = !currentCmp;
      } else {
         if ( current > max )
            max = current;
         
         current = 2;
      }
   }
 
   if ( current > max )
      max = current;
   
   std::cout << max << std::endl;
   
   return 0;
}
Единственно будет выдавать 2 при случае, когда все элементы последовательности равны.
Yandex
Объявления
24.09.2012, 06:47     Пилообразная последовательность
Ответ Создать тему
Опции темы

Текущее время: 03:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru