Мне нужно написать программу, где мне приходится печатать числа, которые встречаются дважды или более двух раз в массиве. Чтобы упростить работу, я работаю над сортированным массивом.
Вот мой код.
#include <stdio.h>
int main()
{
int n,i;
int a[10]={2,2,2,4,6,6,9,10,10,11};
printf("%d\n",a[10]);
for(i=0;i<10;++i)
{
if(a[i]==a[i+1] && a[i]!=a[i-1])
printf("%d ",a[i]);
else
continue;
}
return 0;
}
Код, кажется, работает нормально, но мне не нравится мой код, потому что в какой-то момент цикл сравнивает значение [0] с [-1] и [9] с [10], и оба эти, [-1] и [10] - значения мусора. Я уверен, что есть лучшие способы сделать это, но я не могу ни о чем думать.
Кроме того, мне нужно расширить вышеуказанную программу, чтобы подсчитать частоту повторяющихся чисел.
Помощь приветствуется. Благодарю!
Во-первых, вы не можете получить доступ к [10] в своей строке printf, это вне вашего массива.
Это должно работать нормально.
#include <stdio.h>
int main()
{
int n,i;
int a[10]={2,2,2,4,6,6,9,10,10,11};
for(i=0; i < 9; ++i)
{
if(a[i] == a[i+1])
if(i > 0 && a[i] == a[i-1])
continue;
else
printf("%d ",a[i]);
}
return 0;
}
Изменение: или вы можете использовать более короткие, но более сложные для чтения:
for(i=0; i < 9; ++i)
{
if(a[i] == a[i+1] && (!i || a[i] != a[i-1]))
printf("%d ",a[i]);
}
См. Код ниже для решения, которое будет печатать только повторяющиеся числа из массива и сколько раз они происходят.
Я добавил int c, который используется для вашего подсчета. Первоначально он установлен в 1 и увеличивается на 1 для каждого повторяющегося числа.
#include <stdio.h>
using namespace std;
int main() {
int n,i,c;
int a[10]={2,2,2,4,6,6,9,10,10,11};
c = 1;
for(i=0; i < 9; ++i)
{
if (a[i] == a[i+1]) {
n = a[i];
c += 1;
} else {
if (c > 1) {
printf("Number: %d, Occurences: %d \n",n,c);
c = 1;
}
}
}
return 0;
}
#include <stdio.h>
int main(){
int i, a[10]={2,2,2,4,6,6,9,10,10,11};
int size = 10;
for(i=0;i<size;++i){
int tmp = a[i];
int c = 1;
while(++i < size && tmp == a[i])
++c;
if(c > 1)
printf("%d times %d\n", tmp, c);
--i;
}
return 0;
}
Вы можете использовать функтор, оператор перегрузки() и вернуть набор (уникальные значения). Предполагая, что ваш массив отсортирован, это просто вопрос сравнения предыдущего со следующим и вставка его в набор, если они равны. Если они не отсортированы, вам нужно пройти весь массив для каждой записи. Ниже приводятся два примера с выводами в качестве объяснения.
#include <set>
using namespace std;
Unsorted array:
struct UnsortedArrayDuplicateEntries {
set<int> operator()(int* array, int size) {
set<int> duplicates;
for (int i = 0; i < size - 1; i++)
for (int j = i + 1;j < size; j++)
if (array[i] == array[j])
duplicates.insert(array[j]);
return duplicates;
}
};
Сортированный массив:
struct SortedArrayDuplicateEntries {
set<int> operator()(int* array, int size) {
set<int> duplicates;
for (int i = 0; i < size - 1; i++)
if (array[i] == array[i+1])
duplicates.insert(array[j]);
return duplicates;
}
};
Сортировка теста:
SortedArrayDuplicateEntries d;
int sorted[10]={2,2,2,4,6,6,9,10,10,11};
set<int> resultSorted = d(sorted,10);
for (int i : resultSorted) cout << i << endl;
Выбранный результат:
2
6
10
Тест несортирован:
UnsortedArrayDuplicateEntries d;
int unsorted[10]={2,6,4,2,10,2,9,6,10,11};
set<int> resultUnsorted = d(unsorted,10);
for (int i : resultUnsorted) cout << i << endl;
Выходные данные несортированы:
2
6
10
Я надеюсь, что это помогает!
Поскольку массив уже отсортирован, было бы легче сделать что-то подобное, с другим циклом внутри цикла for
.
int duplicateCount = 1; // Must be at least one instance of a value in the array
for(int i = 0; i < 9; ++i) {
int j = i;
while(j != 9 && a[j] == a[j + 1]) {
++j;
++duplicateCount;
}
i = j; // j is now at end of list of duplicates, so put i at the end as well,
// to be incremented to the next unique value at end of for loop iteration
printf("%d: %d\n", a[j], duplicateCount);
duplicateCount = 1; // Reset for next values
}
Если вы хотите подсчитать частоту всех чисел, вы можете легко превратить duplicateCount
в массив значений, чтобы подсчитать частоту каждого уникального значения. Для лучшего решения вы можете использовать другую структуру данных, такую как карта.
Вам действительно нужно иметь два индекса, которые проходят через ваш массив. Здесь начинается:
int i = 0;
int j;
while (i < 10) {
for (j = i+1; j < 10; ++j) if (a[i] != a[j]) break;
if (j !+ i+i) printf("%d\n", a[i]);
i = j;
}