👤

Fişierele text NR1.TXT şi NR2.TXT conţin, separate prin câte un spaţiu, mai multe numere
întregi de cel mult 9 cifre fiecare. Fiecare dintre fişiere conţine cel mult 100 de valori şi
numerele din fiecare fişier sunt ordonate strict crescător. Se cere să se afişeze pe ecran, în
ordine crescătoare, numerele divizibile cu 5 care se găsesc doar în unul din cele două
fişiere.
Exemplu: dacă fişierul NR1.TXT conţine numerele 1 2 3 4 7 20 60, iar fişierul
NR2.TXT conţine numerele 3 5 7 8 9 10 12 20 24, atunci se vor afişa pe ecran
valorile 5 10 60.


Răspuns :

Nu prea vad ca are vreo limita in timp, dar pentru orice eventualitate de ce sa nu folosim cautarea binara, daca totusi vectorii sint ordonati.
Iar pentru inca o efecienta maxima putem sa "jonglam" cu 2 vectori deodata.

#include <fstream>
#include <iostream>
#include <cmath>

using namespace std;

ifstream fin1("NR1.TXT");
ifstream fin2("NR2.TXT");

int cautare_binara(int a, int b, int v[], int k);
int v1[100],v2[100];

int main()
{

    int n=0,m=0,x=0,y=0,i=0,j=0;

    while(fin1 >> v1[x++])
        n++;
    while(fin2 >> v2[y++])
        m++;

    x=v1[i++];
    y=v2[j++];

    while(true)
    {
        while((x<=y or j>m) and i<=n)
        {
            if(x%5==0 and !cautare_binara(0,m,v2,x))
                cout << x << " ";
            x=v1[i++];
        }
        while((y<=x or i>n) and j<=m)
        {
            if(y%5==0 and !cautare_binara(0,n,v1,y))
                cout << y << " ";
            y=v2[j++];
        }
        if(i>n and j>m)
            return 0;
    }

    return 0;

}
int cautare_binara(int a, int b, int v[], int k)
{
    int m;
    while(a<=b)
    {
        m=floor((a+b)/2);
        if(k==v[m])
            return 1;
        else
        {
            if(k>v[m])
                a=m+1;
            else
                b=m-1;
        }
    }
    return 0;
}