Salt la conținut

SUBIECTE NOI
« 1 / 5 »
RSS
La mulți ani @Piniuli!

Pret inghetata corso kaufland?

La multi ani @Constantin si Elena...

La mulți ani @Ion_Bumbu!
 Obiecte vechi și inutile car...

Mentenanta Acoperis

Cheder deteriorat , zgariat, cum ...

Laptop HP 15-AF001NQ, AMD E1-6015...
 Blat de bucatarie lungime 4,60 m

Termostat incalzire si racire

Configurare retea cu modem Vodafo...

Curtea Penala Internationala soli...
 Sunt obligate bancile sa opteze p...

Pensie anticipata partiala cu cer...

Ce abonamente aveți?

Cat ar costa acest poster, se poa...
 

Să se determine câte dintre perechile de elemente din vector sunt formate din valori cu aceeași sumă a cifrelor.

- - - - -
  • Vă rugăm să vă autentificați pentru a răspunde
42 răspunsuri în acest subiect

#1
MateiGafita

MateiGafita

    Junior Member

  • Grup: Junior Members
  • Mesaje: 83
  • Înscris: 08.05.2019
Buna! As vrea sa ma ajutati la aceasta problema. Se dă un vector cu n numere naturale. Să se determine câte dintre perechile de elemente din vector sunt formate din valori cu aceeași sumă a cifrelor.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spaţii, reprezentând elementele vectorului.
Date de ieșire
Programul afișează pe ecran numărul C, reprezentând valoarea cerută.
Intrare
6
51 842 15 28 77 132
Ieșire
4


#include <iostream>
using namespace std;
int a[100],n,i,j,s1,s2,cif,pairs=0;
int main()
{
	cout<<"n= ";
	cin>>n;
	for(i=0; i<n; i++)
	{
		cout<<"a["<<i<<"]= ";
		cin>>a[i];
	}
	for(i=0; i<n; i++)
	{
		s1=0;
		while(a[i]!=0)
		{
			cif=a[i]%10;
			s1=s1+cif;
			a[i]=a[i]/10;
		}
		for(j=i+1; j<n; j++)
		{
			s2=0;
			while(a[j]!=0)
			{
				cif=a[j]%10;
				s2=s2+cif;
				a[j]=a[j]/10;
			}
			if(s1==s2)
			{
				pairs++;
			}
		}
	}
	cout<<pairs;
	return 0;
}

Editat de MateiGafita, 20 iunie 2019 - 13:06.


#2
pexCom

pexCom

    Senior Member

  • Grup: Senior Members
  • Mesaje: 2.254
  • Înscris: 15.01.2014
Problema în codul tău e că modifici valorile elementelor din șir în timp ce îl parcurgi. Specific, valorile lui a[j].
De la a doua iterație în sus, valorile lui a[j] or să fie toate 0.

Folosește variabile auxiliare pentru a[i] și a[j] când aduni cifrele (de exemplu x și y).

E.g.

			 s2 = 0;
			 y = a[j];
			 while(y != 0)
			 {
					 cif = y % 10;
					 s2 = s2 + cif;
					 y = y / 10;
			 }


"cif" nu îți trebuie, poți să pui direct "s2 = s2 + y % 10".

În plus, ai putea să optimizezi puțin codul, să nu faci operațiile astea la fiecare iterație.

Editat de pexCom, 20 iunie 2019 - 13:54.


#3
buyonevideo

buyonevideo

    STATI ACASA !! :)

  • Grup: Senior Members
  • Mesaje: 7.442
  • Înscris: 06.02.2016
Ai copiat gresit programul ala de adunat cifrele: https://www.sanfound...-sum-of-digits/
Aici - a[i]=a[i]/10; - se modifica valorile originala, deci dupa aia se da peste cap tot programul.
Si cele 2 rinduri care efectiv aduna cifrele, tu le-ai facut 3... nu stiu exact de ce.
#include <iostream>
using namespace std;
int a[100],n,i,j,s1,s2,cif,pairs=0,num;
int main()
{
		cout<<"n= ";
		cin>>n;
		for(i=0; i<n; i++)
		{
				cout<<"a["<<i<<"]= ";
				cin>>a[i];
		}
		for(i=0; i<n; i++)
		{
				s1=0;
				num=a[i];
				while(num!=0)
				{
					s1 = s1 + num % 10;
					num = num / 10;
				}
					cout << "The sum of the digits of " << a[i] << " is " << s1 << endl;
				for(j=i+1; j<n; j++)
				{
						s2=0;
						num=a[j];
						while(num!=0)
						{
								s2 = s2 + num % 10;
								num = num / 10;
						}
						cout << "The sum of the digits of " << a[j] << " is " << s2 << endl;
						if(s1==s2)
						{
								pairs++;
						}
				}
		}
		cout<<pairs;
		return 0;
}


#4
MateiGafita

MateiGafita

    Junior Member

  • Grup: Junior Members
  • Mesaje: 83
  • Înscris: 08.05.2019
Mersi de ajutor!

#5
MateiGafita

MateiGafita

    Junior Member

  • Grup: Junior Members
  • Mesaje: 83
  • Înscris: 08.05.2019
Cum as putea sa optimizez algoritmul ?

#include <iostream>
using namespace std;
int a[100001],n,i,j,s1,s2,pairs=0,x,y;
int main()
{	 
	cin>>n;
	for(i=0; i<n; i++)
		cin>>a[i];
	for(i=0; i<n; i++)
	{   x=a[i];
		s1=0;
		while(x!=0)
		{
			s1=s1+x%10;
			x=x/10;
		}
		for(j=i+1; j<n; j++)
		{   y=a[j];
			s2=0;
			while(y!=0)
			{
				s2=s2+y%10;
				y=y/10;
			}
			if(s1==s2)
			{
				pairs++;
			}
		}
	}
	cout<<pairs;
	return 0;
}



#6
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Mesaje: 27.268
  • Înscris: 10.08.2006
Poți construi suma încă de la citirea numerelor.

În loc să citești n, citești caracter cu caracter si aduni. In vector nu salvezi numarul, ci suma cifrelor.

Ba mai mult, tot la citire poți contoriza câte sunt la fel într-un map ca histograma.

Deci vei avea două bucle, una pentru citirea datelor si calcule, și una pentru afisarea rezultatelor.

Nu mai multe, si nu imbricate.

Pardon, cea de citire are una imbricata.

Oricum ai da-o, complexitate O(n), iar la calculul perechii ia o abordare mai matematica, nu ++

#7
MateiGafita

MateiGafita

    Junior Member

  • Grup: Junior Members
  • Mesaje: 83
  • Înscris: 08.05.2019
#include <iostream>
using namespace std;
int a[100001],n,i,j,s1,s2,pairs=0,x,y;
int main()
{	
cin>>n;
for(i=0; i<n; i++)
{ cin>>a[i];
   s=0;
   while(a[i]!=0)
	 {
	 s=s+a[i]%10;
	 a[i]=a[i]/10;
	 }
	 a[i]=s;
}


Editat de MateiGafita, 20 iunie 2019 - 15:39.


#8
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Mesaje: 27.268
  • Înscris: 10.08.2006
Am zis sa citești cifra cu cifra. E anapoda sa citești tot numărul (care e făcut de biblioteca standard tot cifră cu cifră), ca mai apoi să descompui numărul în cifre.

Deci fa din start ce ai nevoie. Fiecare număr în parte nici nu te interesează. Doar suma cifrelor te interesează.

#9
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Mesaje: 1.361
  • Înscris: 21.04.2019
Programul tau(varianta intiala) refactorizat:
#include <iostream>
#include <string>
using namespace std;
int suma_cifre(int num) {

int s = 0, x= num;
while(num!=0){
s += num % 10;
num /= 10;
}
cout << "The sum of the digits of " << x << " is " << s<< endl;
return s;
}

int* date_user(int n) {
static int a[100];
for(int i=0; i<n; i++){
cout<<"a["<<i<<"]= ";
cin>>a[i];
}
return a;
}

int main(){
int n= 0, pairs = 0;
cout<<"n= ";
cin>>n;

int* a = date_user(n);
for(int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
pairs += suma_cifre(a[i]) == suma_cifre(a[j])? 1:0;
}
}
cout<<pairs;
return 0;
}


Editat de Iulius-Foyas, 20 iunie 2019 - 15:54.


#10
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Mesaje: 31.504
  • Înscris: 10.08.2005
de ce are o functie "int " cout in interior?

Pentru exemplul dat, care sunt cele 4 numere (perechi)?

#11
MateiGafita

MateiGafita

    Junior Member

  • Grup: Junior Members
  • Mesaje: 83
  • Înscris: 08.05.2019
51 15
51 132
842 77
15 132

#12
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Mesaje: 31.504
  • Înscris: 10.08.2005
adica sa amestecam  "logica" cu "debug-ul .

#13
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Mesaje: 1.361
  • Înscris: 21.04.2019

View PostMarianG, on 20 iunie 2019 - 17:10, said:

dupa mine nici main nu contine cout
vezi topicul intial.

#14
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Mesaje: 27.268
  • Înscris: 10.08.2006

View PostMateiGafita, on 20 iunie 2019 - 15:38, said:

#include <iostream>
using namespace std;
int a[100001],n,i,j,s1,s2,pairs=0,x,y;
int main()
{	
cin>>n;
for(i=0; i<n; i++)
{ cin>>a[i];
s=0;
while(a[i]!=0)
	 {
	 s=s+a[i]%10;
a[i]=a[i]/10;
	 }
	 a[i]=s;
}

Ignora discutia tangentiala de deasupra, asta conteaza in primul rand pentru optimizarea codului tau:

View PostOriginalCopy, on 20 iunie 2019 - 15:44, said:

Am zis sa citești cifra cu cifra. E anapoda sa citești tot numărul (care e făcut de biblioteca standard tot cifră cu cifră), ca mai apoi să descompui numărul în cifre.

Deci fa din start ce ai nevoie. Fiecare număr în parte nici nu te interesează. Doar suma cifrelor te interesează.


#15
MateiGafita

MateiGafita

    Junior Member

  • Grup: Junior Members
  • Mesaje: 83
  • Înscris: 08.05.2019
Acesta este codul momentan, dar tot depășește limita de timp.
[<CODE>]
#include <iostream>
using namespace std;
int a[100001],n,i,j,s,pairs=0;
int main()
{

    cin>>n;
    for(i=0; i<n; i++)
    {   s=0;

        cin>>a[i];
        while(a[i]!=0)
        {   s+=a[i]%10;
            a[i]/=10;
        }
        a[i]=s;
    }
    for(i=0; i<n; i++)
        for(j=i+1;j<n;j++)
            if(a[i]==a[j])pairs++;
    cout<<pairs;
    return 0;
}
[<CODE>]

Editat de MateiGafita, 20 iunie 2019 - 17:27.


#16
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Mesaje: 27.268
  • Înscris: 10.08.2006

View PostMateiGafita, on 20 iunie 2019 - 17:25, said:

Acesta este codul momentan, dar tot depășește limita de timp.
[<CODE>]
#include <iostream>
using namespace std;
int a[100001],n,i,j,s,pairs=0;
int main()
{

cin>>n;
for(i=0; i<n; i++)
{   s=0;

cin>>a[i];
while(a[i]!=0)
{   s+=a[i]%10;
a[i]/=10;
}
a[i]=s;

}
for(i=0; i<n; i++)
for(j=i+1;j<n;j++)
if(a[i]==a[j])pairs++;
cout<<pairs;
return 0;
}
[<CODE>]

In secventa cu rosu, tu nu citesti cifra cu cifra, ci citesti tot numarul, si apoi calculezi suma cifrelor. Altfel spus, iterezi de doua ori cifrele, o data prin biblioteca standard (asta face cin >> a[i]), si o data in bucla while marcata cu rosu.

Asta e una dintre ineficiente.

Daca vrei ajutor, trebuie sa fii ajutabil, nu sa-ti bati joc de timpul oamenilor.

#17
MateiGafita

MateiGafita

    Junior Member

  • Grup: Junior Members
  • Mesaje: 83
  • Înscris: 08.05.2019
Am înțeles ce vrei să spui doar că nu știu cum să citesc cifra cu cifra.

#18
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Mesaje: 30.268
  • Înscris: 24.02.2007
Da, e mai eficient sa citesti cifra cu cifra, dar putin probabil sa fie asta motivul pentru depasirea timpului. Mai degraba e din cauza algoritmului O(n2) folosit ulterior.

Editat de dani.user, 20 iunie 2019 - 17:51.


Anunturi

Bun venit pe Forumul Softpedia!

Utilizatori activi: 1

0 membri, 1 vizitatori, 0 utilizatori anonimi

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate