2013-10-15 3 views
1

im ищет красивый и чистый способ увидеть, есть ли в массиве три равных числа.Сравнение трех чисел в массиве

Сейчас у меня есть это:

for (int i = 0; i < nr ; i++) 
{ 
    if(a[i] == 1){one++;} 
    else if(a[i] == 2){two++;} 
    else if(a[i] == 3){three++;} 
    else if(a[i] == 4){four++;} 
    else if(a[i] == 5){five++;} 
    else if(a[i] == 6){six++;} 
} 

if(one >= 3){ 
    printf("Tre tal finns i ettor, 3p\n"); 
}else if(two >= 3){ 
    printf("Tre tal finns i tvår, 6p\n"); 
}else if(three >= 3){ 
    printf("Tre tal finns i treor, 9p\n"); 
}else if(four >= 3){ 
    printf("Tre tal finns i fyror, 12p\n"); 
}else if(five >= 3){ 
    printf("Tre tal finns i femmor, 15p\n"); 
}else if(six >= 3){ 
    printf("Tre tal finns i sexor, 18p\n"); 
} 

В случае, когда (целое число) представляет собой массив из 5 элементов (содержащих elemets 1-6) и «NR» является переменной, чтобы следить за длины массивов.

Если кто-то получил более хороший и лучший способ сделать это, ответьте пожалуйста.

+1

Все элементы массива в диапазоне [1, 6] – Kunal

+0

Каков тип данных в массиве? – Bathsheba

+0

Примечание. Плоская квартира лучше вложенной. –

ответ

6

обобщать для histogram, и в основном, делают первый шаг counting sort:

int histogram[n]; //variable length array are fine in c99, if using older c - malloc 
for (int i = 0; i < n; i++) histogram[i] = 0; //init 
for (i = 0; i < nr; i++) 
    histogram[a[i]]++; 
for (i = 0; i < n; i++) 
    if (histogram[i] >= 3) //found it 
//....  
+1

Не используйте 'new []' в C и не предполагайте, что вновь выделенная память кучи обнулена. – unwind

+1

Спасибо, не видел бирку C. дайте мне секунду, чтобы исправить это. – amit

+0

Кроме того, предполагается, что вы знаете максимально возможное значение и что это разумно. Я имею в виду, что вы * можете * попытаться выделить массив, достаточно большой, чтобы соответствовать всем возможным неподписанным int' (или тем, что вам нужен), но это большая часть памяти. Это неплохая идея, но есть лучшие подходы. –

3

Я хотел бы использовать переключатель-случай как:

switch((a[i]){ 
case 1: one++; 
     break; 
case 2: two++; 
     break; 
case 3: three++; 
     break; 
case 4: four++; 
     break; 
case 5: five++; 
     break; 
case 6: six++; 
     break; 
//default: if you want to add 
} 
0

ли они быть рядом друг Другие? Тогда вам понадобится только флаг var.

Действительно, если Он не заботится о вас, если вы повторяете больше, чем число, но знаете, что они существуют, это будет лучше.

+0

Это ответ? – haccks

+0

У меня нет репутации, чтобы еще оставить комментарий = ( –

+1

Я знаю, поэтому я еще не остановился. – haccks

0

Если вы хотите по-настоящему общее решение, то сортируйте свой входной массив; после сортировки, найти все экземпляры, где число появляется больше, чем n раз, для чего угодно n вы хотите, становится тривиальным.

Если вы хотите что-то для более ограниченного домена или более целенаправленного решения, то другие дали вам несколько полезных советов.

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