MAHAJAN SUBHA Ответов: 3

Как мне найти цифру, которая встречается чаще всего в последовательности с помощью кодирования?


Вам дана последовательность положительных целых чисел, оканчивающаяся на
-1. (-1 не является частью последовательности.) Там будет более 100
положительные числа в последовательности.

Вы должны вывести число, которое встречается наибольшее количество раз в
последовательность.

Что я уже пробовал:

#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
	int arr[100],i=0,j=0,a,final[100],b=0,p=0,l=0,pre_sum[100],s=0,g=0;
	for(i=0;i<100;i++)
	{
		scanf("%d",&a);
		if(a==-1)
			break;
		else
			arr[i]=a;
	}
	
	for(i=0;arr[i]!='\0';i++)
	{
		if(arr[i]==arr[i+1])
		{
			l=l+1;
			final[p]=l;
		}
		else
		{
			l=0;
			p=p+1;
		}
	}
	for(i=0;final[i]!='\0';i++);
	b=i;
	for(i=0;i<b;i++)
	{
		pre_sum[i]=final[i]+final[i+1];
		printf("%d",final[i]);
	}
	int max=final[0];
	for(i=1;i<b;i++)
	{
		if(arr[i]>max)
		{
		
			max=arr[i];
			s=i;
		}
	}
	g=pre_sum[s-2];
	printf("%d",b);
	
	
}

Richard MacCutchan

Почему вы отметили этот sharepoint2010, когда это явно код C? Кроме того, в чем вопрос?

3 Ответов

Рейтинг:
1

OriginalGriff

Другой, более гибкий подход:
1) сортировка массива входных чисел - есть стандартные функции, чтобы сделать это быстро.
2) один проход через результат дает вам ответ, так как одинаковые значения находятся рядом друг с другом и очень легко подсчитываются.

Никаких вложенных циклов, и очень легко читаемый код.


CPallini

Эй, чувак, ты хочешь сказать, что мой код не читается?
:-Д

5.

Рейтинг:
1

Patrice T

У вас есть несколько проблем в этом коде.

int arr[100];

C не инициализируйте переменные и массивы
for(i=0;arr[i]!='\0';i++)

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

Единственный безопасный способ-сделать массив размером 101 и сохранить в конце значение -1.

В соответствии с вопросом, входные данные могут быть 1 0 0 -1

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

[Обновление]
Кстати, смешивать типы в сравнении тоже не очень хорошая идея, это просто усложняет понимание кода:
for(i=0;arr[i]!=0;i++)


Рейтинг:
0

CPallini

С таким небольшим количеством чисел подход грубой силы довольно эффективен:

#include <stdio.h>

int main()
{
  int a[] = {1,23,45,-3,2,60, 51, 13, 42,17,28,-50,42, 25, 19, 27, 75, 128, 42};
  const size_t SIZE = sizeof(a)/sizeof(a[0]);

  size_t i, j;
  int mo_value = -1; // value of most frequent number
  size_t mo_occurrences = 0; // occurrences of most frequent number

  for (i = 0; i<(SIZE-1); ++i)
  {
    int occurrences = 1;
    for (j = i+1; j<SIZE; ++j)
      if ( a[i] == a[j])
        occurrences++;

    if ( mo_occurrences < occurrences )
    {
      mo_occurrences = occurrences;
      mo_value = a[i];
    }
  }

  printf("most frequent number is %d with %lu occurrences\n", mo_value, mo_occurrences);
  return 0;
}


Между прочим, "положительные целые числа" являются числа (нет цифры).


Maciej Los

5ed!

CPallini

Спасибо!