Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Probleme stomac

Sfat achizitie bicicleta oras

"Noi nu furam ca romanii"

Canalele Sky Showtime 1 și S...
 Recomandare anvelope lexus rx

Extindere rețea wireless int...

Configuratie PC

Mufa TV
 PPC Energy

Camera conferinta Tenveo tevo-vl12u

Recomandare rulouri exterioare us...

Gaoyue 858
 Telefon performant pe parte audio...

Aspecte legale https://registratu...

Filtru de apa curata apa de miner...

Unde gasesc borcane mari 5 - litr...
 

Primele numere care nu se divid

* - - - - 1 votes
  • Please log in to reply
19 replies to this topic

#1
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
Dându-se 4 numere: n, a, b și c, să se afișeze primele n numere care nu se divid la nici unul dintre numerele a, b sau c.
Date de intrare
Se citesc cele 4 numere naturale, n, a, b și c în această ordine.
Date de ieșire
Se afișeaza cele n numere care îndeplinesc condiția dată, pe o singură linie, separate prin cate un spațiu.
Restricții
1 ≤ n ≤ 1 000
2 ≤ a, b, c ≤ 1 000
Se garantează că numerele ce se afișează vor fi mai mici decât 10 000.
Eu am rezolvat problema astfel :
#include <iostream>
using namespace std;
int main() {
int n ,a , b , c, i = 1, p , f = 1, d;
cin >> n >> a >> b >> c ;
while (i <= n){
	 p = 1;
	 d = f;
	 while (d > 0 ) {
		 if (d % a == 0){
			 p = 0;
		 }else if (d % b == 0){
			 p = 0;
		 }else if (d % c == 0){
			 p = 0;
		 }
		 d = d / 10;
	
	
	 } if (p == 1 ) {
		 cout << f << " ";
		 ++i;
	 }
	 ++f;
	
}
return 0;
}


si nu pot sa-mi dau seama unde gresesc. Iau doar 50 de puncte.

Edited by althea, 28 April 2022 - 14:52.


#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,226
  • Înscris: 24.02.2007
Ce reprezinta d?

#3
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
Poi in variabila "d" salvez valoarea variabilei " f " ca dupa ce parcurg conditiile din while sa o elimin. Deoarece,  daca nu as face asta valoarea variabilei " f " va fii mereu egala cu 1, inainte sa intre in while, nu ?

Edited by Irbaa, 28 April 2022 - 14:25.


#4
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,226
  • Înscris: 24.02.2007
Avand un numar, n-ai nevoie de un while pentru a verifica daca se divide la alt numar.

#5
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
Si atunci sa refac codul cu un singur while? Sa-l elimin pe cel de al de al doilea ? Oricum , sa presupunem ca fac asta, si simplific codul, rezultatetle vor fii aceleasi. Adica, codul merge conform cerintei. Ca o lista de teste , as putea sa le amintesc pe acestea :
6 3 3 7  -  1 2 4 5 8 10
4 2 6 4  - 1 3 5 7
20 14 21 32  -  1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 17 18 19 20 22
2 2 2 2  - 1 3
Intradevar, la aceste test:
1000 2 100 1001  -  imi afiseaza pana aici 13771 13773 13775 13777 13779 , ceea ce e cu mult peste 10000. Aici sa fie problema?

#6
robert23mg

robert23mg

    Member

  • Grup: Members
  • Posts: 536
  • Înscris: 18.06.2017
Asta e o problema cu problemele de liceu, variabile de o litera care nu au nici un sens si nu comunica nimic.
Numeste si tu alea in asa fel sa reprezinte ceva
n -> numarElemente
a, b, c -> divizor1, divizor2, divizor3
d -> ?ce e asta? numarul pe care il testezi? spune-i altfel, poate numarTestat sau ceva

Si scrie mai ordonat putin, spatiul dupa virgula, nu inainte

#7
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,933
  • Înscris: 24.04.2013
Fara sa fi rulat codul, deci doar dupa examinarea sursei: care este logica din spatele instructiunii d = d / 10, care este rostul ei? Ce se intampla daca a = 2, b = 4, c = 8 si ai ajuns cu testarea la f = 227 (care e prim deci clar nu se divide cu nici unul din a/ b/ c)?

LE: Inca o data recomandarea facuta deja de j’de’mii de ori, si tie si altora in situatii similare: Ruleaza bre programelul sub un depanator, instructiune cu instructiune, examineza variabilele sa vezi daca valorile lor evolueaza in sensul impus de problema/ daca programelul face ce crezi tu si nu cumva o ia pe de-alaturi…

View PostIrbaa, on 28 aprilie 2022 - 14:36, said:

… Intradevar, la aceste test:
1000 2 100 1001  -  imi afiseaza pana aici 13771 13773 13775 13777 13779 , ceea ce e cu mult peste 10000. Aici sa fie problema?
Atentie la nuante: enuntul spune ca intereseaza seturi de date de intrare la care rezultatele nu depasesc 10000. NU spune ca nu exista date de intrare la care sa nu ai si rezulatte mai mari.

Oricum, cu acest set de date ai deja un caz in care programelul o ia pe aratura. Ruleaza-l sub un depanator, examineaza pe ce ramuri o ia si evolutia valorilor variabilelor, sa vezi de ce…

Edited by sags, 28 April 2022 - 15:49.


#8
robert23mg

robert23mg

    Member

  • Grup: Members
  • Posts: 536
  • Înscris: 18.06.2017
Iti las si o varianta in javascript, uita-te la ea doar dupa ce incerci singur sa rezolvi.

https://imgur.com/a/792X0Zh

#9
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,226
  • Înscris: 24.02.2007
Cred ca ai vrut cumva sa aflii cifrele numarlui, ce nu prea are sens pentru cerinta asta.

#10
pexCom

pexCom

    Senior Member

  • Grup: Senior Members
  • Posts: 2,240
  • Înscris: 15.01.2014
Păi ce a pus robert23mg în postul #8 e exact rezolvarea la problema ta.

Edited by pexCom, 28 April 2022 - 17:04.


#11
KiloW

KiloW

    Guru Member

  • Grup: Senior Members
  • Posts: 12,165
  • Înscris: 08.01.2021
Dacă unul dintre a,b sau c este 0 codul asta crapă. Ar trebui o condiție sa nu între în buclă înainte sa verifici asta.

#12
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,933
  • Înscris: 24.04.2013
Enuntul impune a, b, c ≥ 2 deci nu pot fi zero.

#13
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,416
  • Înscris: 10.08.2005
cand nu se divid inseamna ca dau rest,
iar daca dau rest nici unul atunci il contorizam, si ne oprim la 'n'

#14
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
Da, am reusit sa rezolv problema.
dani.user , asa este, acel while era complet inutil. Dar aveam si cred ca inca am obsesia de a folosi while in while fiindca am impresia ca nu-l inteleg. Rezolvarea problemei a constat in a  limita numarul de afisari la 10.000.
sags, logica din spatele acelui while a fost ca pe masura ce parcurg numerele lui "f " sa le sterg, deci acel " d = d / 10 " oprea while-u.
#include <iostream>
using namespace std;
int main() {
int n ,a , b , c, p , f = 1, lim = 10000;
cin >> n >> a >> b >> c ;
for (int i = 1; i <= n;) {
	 p = 1;
	 if (f < lim) {
		 if (f % a == 0 || f % b == 0 || f % c == 0){
			 p = 0;
			 }
		 } if (p == 1){
			 cout << f << " ";
			 ++i;
		 }
		 ++f;
}

return 0;
}


Edited by Irbaa, 29 April 2022 - 17:05.


#15
red46

red46

    Senior Member

  • Grup: Senior Members
  • Posts: 4,547
  • Înscris: 06.03.2016
#include <iostream>
using namespace std;
int main()
{
	int n, a, b, c;
	cin >> n >> a >> b >> c;
   
	int nr_gasite = 0;
	for (int nr = 1; nr_gasite < n; nr++)
	{
		if ((nr % a != 0) && (nr % b != 0) && (nr % c != 0))
		{
			cout << nr << ' ';
			nr_gasite++;
		}
	}
	return 0;
}


View PostIrbaa, on 29 aprilie 2022 - 17:05, said:

Rezolvarea problemei a constat in a  limita numarul de afisari la 10.000.
Problema nu se rezolva limitand artificial numarul de afisari.

#16
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
atunci fac asa :
#include <iostream>
using namespace std;
int main() {
  int  n ,a , b , c, p , f = 1;
  cin >> n >> a >> b >> c ;
  for (int i = 1; i <= n;) {
	   p = 1;
	  
		   if (f % a == 0 || f % b == 0 || f % c == 0){
			   p = 0;
			 }
			if (p == 1){
			   cout << f << " ";
			  ++i;
		   }
		  
		   ++f;
  }
  return 0;
}



#17
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,416
  • Înscris: 10.08.2005
Si p ce rol are?

#18
adrian919

adrian919

    Member

  • Grup: Members
  • Posts: 256
  • Înscris: 23.06.2015
ideea mea = o functie ce testeaza daca exista restul la impartire si reaspunde cu true/false
ceva de genul

functie (n,nrdetest)
if n%nrdetest then return false else return true
testezi asa fiecare pereche de numere si afisezi dupa aia.
Exista cateva fineturi posibile implicand numere prime, numere mai mari decat n, etc.

daca vrei sa impresionezi cu cunostintele de mate poti face lista cu numere prime pana la 1000 , tot felul de verificari.

Edited by adrian919, 30 April 2022 - 15:01.


Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

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