Ошибка подсчета значения массива

Привет, мне нужна помощь, пожалуйста, мне нужно исправить этот код, чтобы он считал значение только один раз

например

вход:

25

38 25 36 4 1 1 10 37 45 21 37 42 21 1 50 9 50 42 6 39 10 14 17 11 20

10

36 42 2 15 28 42 3 23 8 50

выход:

4

ответ здесь должен быть 4, а не 7.

#include <stdio.h>

int main()
{
    int n, m, count = 0;
    int array[1000];
    int subarray[1000];

    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        scanf("%d", &array[i]);
    }

    scanf("%d", &m);

    for (int i = 0; i < m; i++)
    {
        scanf("%d", &subarray[i]);
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < i; j++)
        {
            if (array[i] == subarray[j])
                count++;
        }
    }

    printf("%d\n", count);


}

Ваша логика проверки ошибочна, так как внутренний цикл выйдет за пределы subarray, если n > m. Пара минут с отладчиком сказали бы вам об этом.

Some programmer dude 15.12.2020 08:00

Вы можете добавить вопрос и цель кода? трудно понять, что вы пытаетесь сделать.

the trickster 15.12.2020 08:02

Пример с менее чем 25 и 10 облегчит помощь

Support Ukraine 15.12.2020 08:02

Я рекомендую отсортировать первый массив, удалить последовательные дубликаты, а затем использовать двоичный поиск, чтобы найти каждое число из «подмассива». Возможно, вам также следует отсортировать и удалить дубликаты из «подмассива». (Сортировка необходима для работы бинарного поиска, а также значительно упрощает удаление дубликатов.)

Some programmer dude 15.12.2020 09:47

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

chux - Reinstate Monica 15.12.2020 13:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
95
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вам нужно отслеживать совпадающие значения в третьем массиве следующим образом: проверить, найдено ли новое значение раньше или нет

#include <stdio.h>

int main()
{
 int n, m, count = 0;
 int array[1000];
 int subarray[1000];
 int result[1000];
 scanf("%d", &n);

 for (int i = 0; i < n; i++)
 {
    scanf("%d", &array[i]);
 }

 scanf("%d", &m);

 for (int i = 0; i < m; i++)
 {
    scanf("%d", &subarray[i]);
 }

 for (int i = 0; i < n; i++)
 {
    for (int j = 0; j < i; j++)
    {
        if (array[i] == subarray[j]){
            int isFound=0;
            for(int k=0;k<count;k++){
                if (result[k]==array[i])
                    isFound=1;
            }
            if (isFound==0){
                result[count]==array[i];
                count++;
            }
        }
    }
}

printf("%d\n", count);


}

Я использую логическую переменную, чтобы проверить, существуют ли элементы массива 1 в массиве 2, если нет, я скопирую их в массив 3.

#include <stdio.h>
#include <stdbool.h>//header how found the booleen variable

int main()
{
     int n,m;
     do
     {
         printf("Give me the length of array 1 :");
         scanf("%d",&n);
     }while(n<1);

     int T1[n];//declaration of Array 1
     do
     {
         printf("Give me the length of array 2 :");
         scanf("%d",&m);
     }while(m<1);

     int T2[m];//declaration of Array 2

     printf("The fill of Array 1:\n\n");

     for(int i=0;i<n;i++)
     {
         scanf("%d",&T1[i]);
     }

     printf("The fill of Array 2:\n\n");

     for(int j=0;j<m;j++)
     {
         scanf("%d",&T2[j]);
     }
     int T3[n+m];//declaration of Array 3

     bool found=false;//declaration of booleen variable
     int k=0;
  
     for(int i=0;i<n;i++)
     {found=false;
        for(int j=0;j<m;j++)
        {
              if (T1[i]==T2[j])
              {
                   found=true;
              }
        }
         if (found==true)
         {
             T3[k]=T1[i];
             k++;
         }
     }
     printf("\nThe number of elment duplicate is :%d\n",k);
}
Ответ принят как подходящий

Возможное решение с использованием функций и qsort.

(непроверенный код)

#include <stdio.h>

int binarySearch(int arr[], int l, int r, int x) { 
    if (r >= l) { 
        int mid = l + (r - l) / 2; 
        if (arr[mid] == x) 
            return mid; 
        if (arr[mid] > x) 
            return binarySearch(arr, l, mid - 1, x); 
        return binarySearch(arr, mid + 1, r, x); 
    } 
    return -1; 
}  

int cmpfunc (const void * a, const void * b) {
   return (*(int*)a > *(int*)b) - (*(int*)a < *(int*)b);
}

int main() {
    int n, m, count = 0;
    int array[1000];
    int subarray[1000];

    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        scanf("%d", &array[i]);
    }

    qsort(array, n, sizeof(int), cmpfunc); // O(n lg n)

    scanf("%d", &m);

    for (int i = 0; i < m; i++) {
        scanf("%d", &subarray[i]);
        int result = binarySearch(arr, 0, n - 1, x); // O(lg n)
        if (result != -1)
          count++;
    } // O(m lg n)
    
    printf("%d\n", count);
}

поэтому он считает значение только один раз

С минимальным воздействием на код OP и без переупорядочения ввода:

  • Проверьте, не возникло ли значение subarray[] внутри себя.

  • Когда значения subarray[]/array[] совпадают, перестаньте искать.


for (int j = 0; j < m; j++) {
  bool unique_subarray_value = true;
  for (int earlier = 0; earlier < j; earlier++) {
    if (subarray[earlier] == subarray[j])
      unique_subarray_value = false;
      break;
    }
  }
  if (unique_subarray_value) {
    for (int i = 0; i < n; i++) {
      if (array[i] == subarray[j]) {
        count++;
        break;
      }
    }
  }
}

Быстрый подход отсортировал бы массивы, а затем прошел бы их

// Pseudo code
sort array[n]    with qsort()
sort subarray[m] with qsort()

// walk the arrays looking for matches
i = 0;
j = 0;
while (i < n && j < m) {
  if (array[i] == subarray[j]) {
    count++;
    while (i + 1 < n && array[i] == array[i+1]) i++;
    while (j + 1 < m && subarray[j] == subarray[j+1]) j++;
  }
  if (array[i] < subarray[j]) i++;
  else j++;
}

Другие вопросы по теме