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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
Tattoquardas
0 / 0 / 0
Регистрация: 22.10.2011
Сообщений: 21
#1

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

23.09.2012, 01:51. Просмотров 2464. Ответов 5
Метки нет (Все метки)

Последовательность 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++ Последовательность
C++ Последовательность
C++ последовательность
C++ последовательность 1 3 5 7 ... 8 6 4 2 0
Преобразовать литерную последовательность в другую литерную последовательность всеми описанными ниже способами C++
Последовательность - 2 C++
C++ Последовательность
Последовательность C++
C++ последовательность
C++ Последовательность
Последовательность C++
Последовательность C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cmath
Модератор
 Аватар для cmath
2419 / 1638 / 132
Регистрация: 11.08.2012
Сообщений: 3,258
Завершенные тесты: 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
4661 / 2487 / 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
2419 / 1638 / 132
Регистрация: 11.08.2012
Сообщений: 3,258
Завершенные тесты: 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 / 51
Регистрация: 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     Пилообразная последовательность
Ответ Создать тему
Опции темы

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