Problema in C++ cu siruri de numere

Buna seara.Am si eu o problema de rezolvat si nu reusesc sa ii dau de cap.Trebuie sa o rezolv doar cu WHILE,IF si FOR.Nu pot folosi altceva(pointeri,functii etc…)

Cerinta:

Ți se dă un șir de n numere întregi, reprezentând pachetele trimise și un alt șir cu n - 1 numere întregi, reprezentând pachetele care au ajuns cu succes până la tine. Elementele din cel de-al doilea șir vor fi în aceeași ordine ca și cele din primul, cu excepția unui element din primul șir care va lipsi din al doilea. Identifică elementul lipsă.

Date de intrare:
Pe prima linie se va găsi numărul n , iar pe următoarele două linii elementele celor două șiruri.

Date iesire:
Se va afisa pe ecran nr X,adica elementul lipsa din al 2 lea sir

Restrictii:

  • 1 ≤ n ≤ 1 000
  • elementele din șir nu vor avea valori mai mari de 100 000, respectiv mai mici de -100 000

Date intrare:

10
34 32 45 -67 89 21 34 5 7 9
34 32 45 89 21 34 5 7 9

Date iesire:
-67

Va rog sa ma ajutati,ca ma chinui de 2 zile si nu reusesc sa ii dau de cap.

De ce nu ne spui si ce ai incercat sa faci? :slight_smile:

La o prima vedere pare ca ai nevoie de 2 for-uri cu care sa parcurgi cele 2 array-uri cu acele numere si sa verifici daca sir1[i] = sir2[i]

Nu functioneaza sub nici o forma:( sincer am vazut codul pe un site si dupaia am incercat sa il modific sa ii tot fac adaugari etc si degeaba…sunt incepator si mi-e greu sa ma prind de unele chestii.

#include <iostream>
using namespace std;
int main()
{
        int n, lipsa, m;
        cin >> n >> m;
        int a[100001];
        int b[100001];
        for (int i = 1; i <= n; i++)
        {
                cin >> a[i];
        }
        for (int i = 1; i <= n - m; i++)
        {
                cin >> b[i];
        }
        for (int i = 1; i <= n; i++)
        {
                lipsa = 1;
                for (int j = 1; j <= n - m; j++)
                {
                        if (a[i] == b[j])
                        {
                                lipsa = -1;
                        }
                }
                if (lipsa == 1)
                {
                        cout << a[i] << " ";
                }
                else
                        cout << "Nu lipsesc numere";
        }
        return 0;
}
if (sir1.length == sir2.length) {
            System.out.println("sirurile  sunt egale");
        }
        else {
            for (int i = 0; i < sir1.length; i++){
                if (sir1[i] != sir2[i]){
                    System.out.println("elementul lipsa: " + sir1[i]);
                    break;
                }
            }

        }
    }

Desi este in java, codul este destul de simplu si poate fi adaptat si pt c

  • presupun ca sirurile sunt egale
  • testez elementele din ele si afisez ceea ce este diferit.

image

Traducerea in C

    for(int i = 0; i < n; i++)
    {
        if (a[i] != b[i]) {
            //cout << "elementul lipsa: " << a[i];
            printf("elementul lipsa:%d", a[i]);
            break;
        }
    }

Si pastrezi partea de citire.

Este ok sa iei cod de pe net, insa incearca sa intelegi ce-i pe acolo. Foloseste un debugger si poti folosi breajpoint-urile sa vezi ce valori au variabilele, la ce conditie se evalueaza un if etc.

Daca folosesti Visual Studio, doar dai click pe bara din stanga si iti pui breakpoint su cu butoanele de aici image te misti prin program. Mai poti folosi si F10 si F11

Mersi frumos pentru ajutor/suport,dar nu pot sa folosesc de exemplu cum ai scris(sizeof)…strict while,for si if…nu pot sa adaug nimic altcv.Trebuie sa ma limitez doar la lucrurile astea 3 si sa o rezolv prin formule matematice prin orice,dar nu sa scriu sir.length sau sizeof…asta e problema ca ma limiteaza f mult utilizand doar if,while si for…incerc sa adaptez ce mi-ai scris tu acum si poate reusesc.

sizeof() este pentru dimensiunea array-ului.
vezi mai multe detalii la @serghei in raspuns.

Am inteles:)…in momentul de fata,programul arata asa:

#include <iostream>
using namespace std;
int main()
{
    int n, m;
    cin >> n >> m;
    int a[100001];
    int b[100001];
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    for (int i = 1; i <= n - m; i++)
    {
        cin >> b[i];
    }
    for(int i = 0; i < sizeof(a); i++)
    {
        if (a[i] != b[i])
        {
            cout<<a[i];
            break;
        }
    }
    return 0;
}

daca testez pentru un sir de 3 4 numere functioneaza dar daca introduc:
10
34 32 45 -67 89 21 34 5 7 9
34 32 45 89 21 34 5 7 9

Imi afiseaza doar al 2 lea element si nu inteleg de ce.

De ce citesti pana la n-m?
Conform problemei, ar trebui pana la n - 1

ca o sa ai pt n = 10 si m = 9, 10 -9 care este 1

la prima iteratie o sa ai a[0] = b[0] deci conditia este falsa, trece mai departe a[1] = b[1], dar pt ca array-ul b are un singur element se opreste acolo si nu mai continua

PS:
Pune si tu niste mesaje. Ca sa stiu si eu ce fac pe acolo si sa nu dau in taste aiurea :slight_smile:

am modificat cum ai spus,dar daca la al 2 lea for pun n-1 in loc de n-m cand introduc al 2 lea sir nu pot sa introduc 9 elemente,trebuie sa introduc tot 10.

Nu intelege ce are programul asta:)) acum imi da total aiurea si e acelasi cod:)) jur ca nu mai rezist,azi am stat 6 ore si tot nu am reusit sa o rezolv:( ma scoate din minti

Atenţie, in C/C++ sizeof() nu returnează numărul de elemente din array, ci dimensiunea in bytes a array-ului. Având in vedere ca dimensiunea unui integer este de 4 bytes, un array de 100001 elemente va avea 400004 bytes.

2 Likes

Dimensiunea sirurilor e stiuta deja, nu e nevoie sa fie determinata. La citire tu acolo iterezi de la 1 iar apoi la comparatie iterezi de la 0, nu are cum sa dea bine. Nu am facut de mult C/C++ dar cred ca ar trebui sa arate cam asa:

#include <iostream>

using namespace std;
int main()
{
	long n;
	cout << "Input n: ";
	cin >> n;
	long a[1000];
	long b[1000];
	for (long i = 0; i < n; i++)
	{
		cout << "Input a" << i << " ";
		cin >> a[i];
	}
	for (long i = 0; i < n - 1; i++)
	{
		cout << "Input b" << i << " ";
		cin >> b[i];
	}
	//daca e un singur element atunci numai ala poate fi cel diferit
	if (n == 1)
	{
		cout << a[0];
		return 0;
	}

	//parcurgem sirul mai scurt si verificam in sirul mai lung
	for (long i = 0; i < n - 1; i++)
	{
		if (a[i] != b[i])
		{
			cout << a[i];
			return 0;
		}
	}

	//daca nu am gasit nimic si al doilea sir s-a terminat inseamna ca e ultimul element din primul
	cout << a[n-1];
	return 0;
}

De fapt cred că te-ai complicat îngrozitor. Ai nevoie de un singur for, ceva de genul:

int a[1000[;
int b[1000];
int n1 = 0; // numarul de elemente de pachete transmise
int n2 = 0; // numarul de elemente de pachete primite

[...]
/// aici e codul unde populezi array-urile
[...]

for(int i = 0; i < n1 && i < n2; i++)
{
    if(a[i] != b[i]) // elementele nu corespund, am gasit pachetul lipsa
    {
       cout << "pachetul lipsa este " << a[i] << ", la pozitia " << i << "\n";
       break;
    }
}  

Cam asta-i tot.

1 Like

Va multumesc tuturor pentru ajutor,am folosit solutia lui TGeorge si a functionat perfect!

Va multumesc inca odata pentru ajutor!
Acum vreau sa ma uit peste cod sa il inteleg cap coada!

Va doresc tuturor o seara buna!

Vezi ca am schimbat de pe int pe long pt ca precieaza range de la -100 000 la 100 000. Am uitat ca in C int e pe 16 biti (-32,767 la 32,767), eu lucrez in cea mai mare parte in C# si acolo int e pe 32.

1 Like

Nu, în C “int” e pe 32 de biti pe CPU 32/64 bit. 16 biti are “short”.

1 Like

Ai dreptate, am citit gresit, de fapt scrie ca e MINIM pe 16 biti. Cu toate astea imi amintesc ca prin liceu ala era range-ul la int, poate avea legatura si cu compilatoru ca pe atunci foloseam Borland C parca?

bcw 3.1 sau 5
memories :slight_smile:

Dacă e vorba de C++ care rula pe DOS, da, de aia avea 16 biţi integer-ul. Era criminală programarea pe vremea aia, cu segmentări & stuff.

Small note: cred că se poate rezolva mult mai simplu, adică suma primului array minus suma celui de-al doilea

Da, la o prima vedere cred ca ar merge si cu suma.

Dar hai sa “hardcorizam” problema putin ca sa folosim un operator rar intalnit in viata unui web dev … pentru nici un motiv whatsoever decat pentru putin amuzament.

Sa zicem ca n, numar natural, se poate duce pana maximul unui numar intreg de tip unsigned long long ( 18,446,744,073,709,551,615). Oh si sa zicem ca trebuie sa rezolvi problema in O(n). Asta inseamna ca probabil nu o sa poti tine ambele siruri in memorie :stuck_out_tongue:

Rezolvarea este una foarte distractiva ca practic nu folosesti decat XOR pentru toata treaba:

$ cat input.txt
10
34 32 45 -67 89 21 34 5 7 9
34 32 45 89 21 34 5 7 9
$ cat main.cpp
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream input("input.txt");

    unsigned long long n;
    input >> n;

    long int numberFound;
    input>>numberFound;

    long int currentNumber;
    while(input>>currentNumber) {
      numberFound = numberFound xor currentNumber;
    }

    cout << numberFound << endl;
    return 0;
}
2 Likes