Привет, мне нужна помощь, пожалуйста, мне нужно исправить этот код, чтобы он считал значение только один раз
например
вход:
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);
}
Вы можете добавить вопрос и цель кода? трудно понять, что вы пытаетесь сделать.
Пример с менее чем 25 и 10 облегчит помощь
Я рекомендую отсортировать первый массив, удалить последовательные дубликаты, а затем использовать двоичный поиск, чтобы найти каждое число из «подмассива». Возможно, вам также следует отсортировать и удалить дубликаты из «подмассива». (Сортировка необходима для работы бинарного поиска, а также значительно упрощает удаление дубликатов.)
@Someprogrammerdude После сортировки массивов нет необходимости удалять дубликаты, просто пропустите дубликаты во время сравнения, поскольку их легко найти, поскольку они расположены рядом.
Вам нужно отслеживать совпадающие значения в третьем массиве следующим образом: проверить, найдено ли новое значение раньше или нет
#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++;
}
Ваша логика проверки ошибочна, так как внутренний цикл выйдет за пределы
subarray
, еслиn > m
. Пара минут с отладчиком сказали бы вам об этом.