// L-7 MCS 360 Wed 8 Sep 2010 : find_duplicates.cpp

/* The program below generates two sequences of random numbers
   and then searches for duplicates. */

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void generate_numbers ( int n, int m, int* data );
// generates n random numbers in data in range 0..m-1

void write_numbers ( int n, int *data );
// writes the sequence of n numbers in data

int inner_product ( int n, int *A, int *B );
// returns the inner product of A and B

int find_duplicates ( int n, int *A, int *B );
// given two arrays A and B of n elements,
// this function returns the number of elements
// that occur in A and in B

int main()
{
   const int n = 10000;
   const int modulus = 100;
   srand(time(0));

   int A[n];
   generate_numbers(n,modulus,A);
   cout << "A :"; write_numbers(n,A);
   int B[n];
   generate_numbers(n,modulus,B);
   cout << "B :"; write_numbers(n,B);

   int cnt = find_duplicates(n,A,B);
   cout << "Found " << cnt << " duplicates." << endl;

   return 0;
}

void generate_numbers ( int n, int m, int* data )
{
   for(int i=0; i<n; i++) data[i] = rand() % m;
}

void write_numbers ( int n, int *data )
{
   for(int i=0; i<n; i++) cout << " " << data[i];
   cout << endl;
}

int inner_product ( int n, int *A, int *B )
{
   int sum = 0;
   for(int i=0; i<n; i++)
      sum = sum + A[i]*B[i];
   return sum;
}

int find_duplicates ( int n, int *A, int *B )
{
   int cnt = 0;
   for(int i=0; i<n; i++)
      for(int j=0; j<n; j++)
         if(A[i] == B[j])
         {
            // cout << "A[" << i << "] = " << A[i] << " == "
            //      << "B[" << j << "] = " << B[j] << endl;
            cnt++;
         }
   return cnt;
}

