2015-07-30 3 views
2

Учитывая массив чисел, распечатайте каждый доступный диапазон. Например: Array: 9, 3, 5, 7, 4, 8, 1 Выход: 1, 3-5, 7-9 Примечание: Пожалуйста, выполните эту проблему, не используя дополнительный массив.Найти последовательности любого диапазона

Как я могу продолжить? *

#include<stdio.h> 
int main() 
{ 
int a[]={9,8,8,7,6,5,14}; 
int n= sizeof(a)/sizeof(a[0]); 
int i,j; 
int temp; 
for(i=0;i<n;i++) 
     { 
       for(j=i+1;j<n;j++) 
       { 
        if(a[i]>a[j]) 
        { 
          temp=a[i]; 
          a[i]=a[j]; 
          a[j]=temp; 
        } 
       } 
     } 
} 

* первый я сортирует в порядке возрастания, я не знаю, что делать дальше? P.S: Я кодирую это в C.

ответ

0

Следующий шаг - идентифицировать последовательности. Попробуйте следующий цикл (не полностью отлажен):

first= next= a[0]; 
for (i=1; i<n; i++) { 
    if (a[i] > next+1) { 
     if (next>first) 
      printf("%d-%d,", first, next); 
     else printf("%d,", first); 
     first= next= a[i]; 
    } 
    else next++; 
} 
+0

Его сортировка коды могут также иметь проблема. Похоже, он пытался сделать вид пузыря. –

+0

@ Tim-Biegeleisen, мы оставим это как домашнюю работу ... –

+0

Вы можете спросить и показать код того, что вы пробовали. Мы должны только помочь вам исправить ошибки [мысли], но не делать домашнее задание. –

0

Я написал простую, легко читаемую функцию для вас, посмотрите:

void printRange(int sortedArray[], int len) { 
    int i, current, next, printStart, printEnd, startIndex = 0; 
    bool print = false; 

    for (i = 0; i < len; i++) { 
     printStart = sortedArray[startIndex]; 
     printEnd = sortedArray[i]; 

     current = sortedArray[i]; 
     if(i < len -1) { 
      next = sortedArray[i + 1]; 
     } else 
       next = current; 

     if (next - current != 1) { 
      startIndex = i + 1; 
      print = true; 
     } 

     if (print) { 
      if (printStart - printEnd == 0) { 
       printf("%d,", printStart); 
      } else { 
       printf("%d-%d,", printStart, printEnd); 
      } 
      print = false; 
     } 
    } 
} 

Run live.

Примечание для хорошего понимания переменной current , а current и printEnd - это то же самое. Вы можете заменить current на printEnd.

+0

@Akash hm, продолжение. –

+0

@Akash, это совершенно другая проблема. Откройте еще один поток и задайте этот вопрос. Потому что его не удобно давать ответ в комментарии. –

+0

@ rakeb.void Ваша функция неправильная. –

0

Если вы можете изменить исходный массив, то есть если вы можете отсортировать его, то программа может выглядеть

#include <stdlib.h> 
#include <stdio.h> 

int cmp(const void *lhs, const void *rhs) 
{ 
    int a = *(const int *)lhs; 
    int b = *(const int *)rhs; 

    return (b < a) - (a < b); 
} 

int main() 
{ 
    int a[] = { 9, 8, 8, 7, 6, 5, 14 }; 
    const size_t N = sizeof(a)/sizeof(*a); 

    qsort(a, N, sizeof(int), cmp); 
/*  
    for (size_t i = 0; i < N; i++) printf("%d ", a[i]); 
    printf("\n"); 
*/  
    int *p = a; 
    int *start = a, *end = a; 
    do 
    { 
     if (++p == a + N || *p != *end + 1) 
     { 
      printf("{ %d", *start); 
      start == end ? printf(" }\n") : printf(", %d }\n", *end); 
      start = end = p; 
     } 
     else 
     { 
      end = p; 
     } 
    } while (p != a + N);    
}  

Выход программы

{ 5, 8 } 
{ 8, 9 } 
{ 14 } 
+0

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/84711/discussion-on-answer-by-vlad-from-moscow-find-sequences-of-any-range). –

Смежные вопросы