Jump to content
Che

Cate numere au aceeasi terminatie ? [ALGORITM]

Recommended Posts

Posted

Salut !

Vreau sa fac un program care sa-mi analizeze un grup de x numere si sa-mi zica cate din ele au aceeasi terminatie.

M-am gandit sa fac doar pentru 6 ca sa nu ma complic cu prea multe si m-am cam impotmolit.

Programul este pe clase.


int basic::sameterm(int unu, int doi,int trei,int patru,int cinci,int sase)
{
//incarcam numerele in vector:
int a[10];
a[1] = unu; a[2] = doi; a[3] = trei; a[4] = patru; a[5] = cinci; a[6] = sase;

//ciclam prin numere ca sa vedem cate au aceeasi terminatie:
int term1, term2;
int same_term = 0;
for (int z = 1; z <= 3; z++) //verificam doar prima jumatate 6:3=3 de unde si z<=3;
for (int i = z + 1; i <= 6; i++)
{
term1 = a[z] % 10;

term2 = a[i] % 10;
if (term1 == term2)
same_term++;

}
if(same_term) //in cazul in care sunt doar doua numere cu aceeasi terminatie same_term va fi egal cu 1 si programul va intoarce 1 in loc sa zica ca de fapt sunt doua numere, de asta am adaugat acest if
same_term++;
return same_term;
}

Nu stiu cum sa fac sa-mi returneze rezultatul corect. Inital m-am gandit ca daca verific doar prima jumatate din grup (adica primele 3 in cazul in care am un grup de 6 numere) acuma dupa cateva testari se pare ca nu prea iese ceea ce am vrut eu sa fac. Spre exemplu daca le bag pe toate 6 cu aceeasi terminatie imi da rezultatul 13.

Cred ca am gasit unde ar fi problema insa nu stiu cum sa o rezolv: daca verifica primele trei numere sa zicem si acestea au toate aceeasi terminatie, atunci same_term va fi 3, chestia e ca programul apoi va verifica si cel de-al doilea numar sa vada daca gaseste vreo terminatie comuna si astfel numerele 2 si 3 vor fi contabilizate de 2 ori (prima oara la verificarea primului numar si a doua oara la verificarea celui de-al doilea numar). Cred ca asta e problema. Nu stiu sigur.

Iata si main.cpp:


#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <basic.h>

using namespace std;

int main()
{
int N1, N2, N3, N4, N5, N6;


cout<< "Primul termen este: ";
cin>>N1;
cout<<"Al doilea termen este: ";
cin>>N2;
cout<< "Al treilea termen este: ";
cin>>N3;
cout<<"Al patrulea termen este: ";
cin>>N4;
cout<< "Al cincilea termen este: ";
cin>>N5;
cout<<"Al saselea termen este: ";
cin>>N6;

//incarcam numerele in vector:
int a[10];
a[1] = N1; a[2] = N2; a[3] = N3; a[4] = N4; a[5] = N5; a[6] = N6;

basic MyObj;

int p = MyObj.sameterm(a[1],a[2],a[3],a[4],a[5],a[6]);


cout<<"Numere care au aceeasi terminatie: ";
cout<<p<<endl;


return 0;
}

Nu stiu vectori si alte tipuri de containeri specifici C++, stiu doar matrici ex. a[x];

Ma ajuta cineva ?

Multumesc mult !

Posted

template <typename T>
std::string NumberToString ( T Number )
{
std::ostringstream ss;
ss << Number;
return ss.str();
}

Codul de mai sus converteste numerele in string-uri. Urmatoarea secventa le inverseaza:

#include <algorithm>
std::reverse(str.begin(), str.end());

Acum poti pune string-urile intr-o matrice:

std::vector<std::string> mat = {"123", "223"};

Cum poti intera prin prima litera a fiecarui string. Iei prima valoare si o retii. Pe masura ce treci prin matrice verfici care se potrivesc si memorezi indexul.

Posted (edited)
Acelasi terminatie adica?

123 si 223 au acelasi terminatie?

Poti sa imi dai un exemplu?

MS:)

Da, au aceeasi terminatie. La fel ca 11,21,31,41,51 si 55,95,105,305.

template <typename T>
std::string NumberToString ( T Number )
{
std::ostringstream ss;
ss << Number;
return ss.str();
}

Codul de mai sus converteste numerele in string-uri. Urmatoarea secventa le inverseaza:

#include <algorithm>
std::reverse(str.begin(), str.end());

Acum poti pune string-urile intr-o matrice:

std::vector<std::string> mat = {"123", "223"};

Cum poti intera prin prima litera a fiecarui string. Iei prima valoare si o retii. Pe masura ce treci prin matrice verfici care se potrivesc si memorezi indexul.

Nu poti face, te rog, o clasa, fara vectori ca eu nu stiu vectori ?

Sau daca nu, poate reconstruiesti cu vectori (daca nu poti altfel) clasa data de mine mai sus dar care sa faca ceea ce trebuie, fara buguri, adica sa imi zica exact cate numere au aceeasi terminatie ?

Multumesc mult !

Edited by Che
Posted

bool Numere_cu_terminatie_egala(int a, int
{
return a % 10 == b % 10;
}

Pai si cand ai mai mult de doua numere cum faci ? Eu am de verificat 6 spre exemplu. Algoritmul asta al tau pare sa verifice doar doua, nu ? Ia doar doi parametri...

Posted (edited)

Poftim ceva foate basic:


#include <iostream>

using namespace std;

int main()
{
int n,terminatie,i,numere[50],x=0;
cout << "n:";
cin >> n;
cout << "terminatie:";
cin >> terminatie;
for(i=1;i<=n;i++)
{
cout << i << ":";
cin >> numere[i];
}
for(i=1;i<=n;i++)
{
if(terminatie==numere[i]%10)
x++;
}
cout << x << " numere se termina in " << terminatie;
}

Edited by 1337
Posted (edited)


#include <cstdarg>
bool Numere_cu_terminatie_egala(int k, ...)
{
va_list argumente;

va_start(argumente, k);

int ultima_cifra_a_primului_nr = va_arg(argumente, int) % 10;

for (int i = 1; i < k; i++)
if (ultima_cifra_a_primului_nr != (va_arg(argumente, int) % 10))
return false;

va_end(argumente);

return true;
}

?i se folose?te a?a:


int nr_numere = 4;

int a = 234;
int b = 34;
int c = 4;
int d = 2424;

if (Numere_cu_terminatie_egala(nr_numere, a, b, c, d))
cout << "Toate numerele au terminatia egala!";
else
cout << "Nu toate numerele sunt egale!";

Edited by H3xoR
Posted

In cazul in care am inteles corect, tu vrei sa vezi cate numere au aceeasi terminatie, nu care numere au aceeasi terminatie, corect?

In cazul asta iata ce am facut eu.

In codul meu trebuie sa creezi matricea cu int-urile doar o singura data, restul se trimite prin pointeri unde trebuie.

De asemenea daca vrei sa iti afiseze si acolo unde exista 1 singur numar cu terminatia respectiva modifica linia :

if(terminatii <= 1)

cu

if(terminatii == 0)


#include <iostream>

using namespace std;

class terminatie
{
public:
terminatie(int* matrice, int marime_matrice);
terminatie(const terminatie& t);
void aceeasiTerminatie();
private:
int* m_matrice;
int m_marime_matrice;

};

terminatie::terminatie(int* matrice, int marime_matrice) : m_matrice(matrice), m_marime_matrice(marime_matrice)
{
}
terminatie::terminatie(const terminatie& t)
{
m_matrice = t.m_matrice;
m_marime_matrice = t.m_marime_matrice;
}

void terminatie::aceeasiTerminatie()
{
int terminatii[10] = {};
for(int i = 0; i < m_marime_matrice;i++)
{
terminatii[m_matrice[i] % 10]++;
}
cout << "Printam cate terminatii sunt pentru fiecare cifra. Unde este unul sau nici un numar se trece peste.\n";
for(int i = 0; i < 10;i++)
{
if(terminatii[i] <= 1)
{
continue;
}
cout << "Exista " << terminatii[i] << " cu terminatia " << i << endl;
}
}

int main()
{
int matr[] = {15, 24, 32, 11, 65, 55, 42, 44, 18, 55};
terminatie t(matr, 10);
t.aceeasiTerminatie();
//cout << "Hello world\n";
return 0;
}

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...