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
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.
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 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.
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
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.
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;
}
}
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.
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?
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
Rezolvarea este una foarte distractiva ca practic nu folosesti decat XOR pentru toata treaba: