Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cum sterg mails din Promotions

Vanzare cumparare fara transfer b...

Receptie ciudata, in functie de t...

Dupa 20 ani de facultate, am uita...
 Mobile.de ofera imprumut de bani ...

problema test grila

Digi24 a disparut de pe TV Lg

Drept de proprietate intelectuala...
 Jante noi shitbox

Trinitas TV 4K

Dacia 1316 cu 6 usi ...

Frecventa modificata radio
 Un nou pericol pt batrani

Ar trebui sa vindem imobiliarele ...

Dupa renuntarea la aparat dentar

pelerinaj in Balcik
 

Cate cifre sunt prime?

- - - - -
  • Please log in to reply
13 replies to this topic

#1
lowly

lowly

    Junior Member

  • Grup: Members
  • Posts: 98
  • Înscris: 17.11.2012
Salut, am gasit intr-un model de bac o problema,  "Sa se afiseze cate cifre sunt prime din numarul : 1233405", se va afisa 5 .
Am incercat, am esuat si am decis sa intreb, eventual sa ma corectati.

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
	int n, nr, i, k;
	cin >> n; // 1233405
	while (n) {
		nr = n % 10;
		for (i = 2; i < sqrt(nr); i++) {
			if (nr % i != 0)
				k++;
		}
		n = n / 10;
	}
	if (k > 0)
		cout << k;
	else
		cout << "nu exista cifre prime";
}


Astept sfaturi...

Edited by dani.user, 20 January 2017 - 18:15.


#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
Tu incrementezi pe k cand i nu e un divizor al cifrei (da "nr" in codul tau reprezinta o cifra - sursa de confuzie). Separa determinarea numerelor prime de numararea lor.

#3
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 lowly, on 20 ianuarie 2017 - 18:09, said:

Salut, am gasit intr-un model de bac o problema,  "Sa se afiseze cate cifre sunt prime din numarul : 1233405", se va afisa 5 .
Am incercat, am esuat si am decis sa intreb, eventual sa ma corectati.

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int n, nr, i, k;
cin >> n; // 1233405
while (n) {
	 nr = n % 10;
	 for (i = 2; i < sqrt(nr); i++) {
		 if (nr % i != 0)
			 k++;
	 }
	 n = n / 10;
}
if (k > 0)
	 cout << k;
else
	 cout << "nu exista cifre prime";
}


Astept sfaturi...
Lista de cifre prime e finita si mica, 1, 2, 3, 5, 7, e mult mai ieftin dpv algoritmic sa folosesti un if, decat sa calculezi sqrt() si sa iterezi pana la el.

if((cifra%2 && cifra != 9) || cifra == 2)

Edited by OriginalCopy, 20 January 2017 - 18:34.


#4
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,956
  • Înscris: 24.04.2013
Pentru numarul 1233405 raspunsul corect este 4 nu 5. Prin definitie numerele prime sunt acele numere nenule si neinversabile care nu au divizori proprii (daca numarul este N, nu exista a si b ambele neinversabile astfel ca N = a × b). In numere intregi 1 este inversabil (doar el si -1 sunt), deci NU e prim. 0 e nul. 4 are divizori proprii. Dintre cifrele acelea sunt prime doar 2 3 si 5.

#5
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 sags, on 20 ianuarie 2017 - 18:48, said:

Pentru numarul 1233405 raspunsul corect este 4 nu 5. Prin definitie numerele prime sunt acele numere nenule si neinversabile care nu au divizori proprii (daca numarul este N, nu exista a si b ambele neinversabile astfel ca N = a × b). In numere intregi 1 este inversabil (doar el si -1 sunt), deci NU e prim. 0 e nul. 4 are divizori proprii. Dintre cifrele acelea sunt prime doar 2 3 si 5.
... Exercitiul ii cere asa. Si eu il lasasem pe 1 deoparte, apoi l-am adaugat.

#6
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,956
  • Înscris: 24.04.2013
Daca exercitiul o cere, inseamna ca exercitiul e conceput de cineva care vorbeste de numere prime fara sa stie ce sunt ele si cu ce se mananca…

#7
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 sags, on 20 ianuarie 2017 - 18:59, said:

Daca exercitiul o cere, inseamna ca exercitiul e conceput de cineva care vorbeste de numere prime fara sa stie ce sunt ele si cu ce se mananca…
Bineinteles. Un sistem prost platit cum e cel de invatamant in Romania nu poate coagula in jurul sau decat prosti.

Deci o formula corecta ar fi

cifra == 2 || (cifra%2 == 1 && cifra%8 != 1)

Edited by OriginalCopy, 20 January 2017 - 19:16.


#8
lowly

lowly

    Junior Member

  • Grup: Members
  • Posts: 98
  • Înscris: 17.11.2012

 dani.user, on 20 ianuarie 2017 - 18:20, said:

Tu incrementezi pe k cand i nu e un divizor al cifrei (da "nr" in codul tau reprezinta o cifra - sursa de confuzie). Separa determinarea numerelor prime de numararea lor.
Eu trebuie doar sa le numar, conditia + k-ul ar fi ideala, pentru cerinta.
P.s. mersi pentru organizarea codului, k-ul trebuie declarat cu 0 ori in int ori pe parcurs, ma miram de ce imi dadea un numar de 7 cifre cand rulam :angel:


 OriginalCopy, on 20 ianuarie 2017 - 19:05, said:

Bineinteles. Un sistem prost platit cum e cel de invatamant in Romania nu poate coagula in jurul sau decat prosti.

Deci o formula corecta ar fi

cifra == 2 || (cifra%2 == 1 && cifra%8 != 1)
Corect, doamna Prof. ne-a sugerat sa facem cu 'for' pentru ca asa este in algoritmul de numar prim. Imi poti arata si varianta cu 'for' ?

#9
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,444
  • Înscris: 10.08.2005
Si v-a sugerat doar la modul "eu sunt profesor" sau v-a dat si un motiv ?

uite o varianta aici -- https://forum.softpe...iabile-globale/ --

#10
lowly

lowly

    Junior Member

  • Grup: Members
  • Posts: 98
  • Înscris: 17.11.2012

 MarianG, on 20 ianuarie 2017 - 21:57, said:

Si v-a sugerat doar la modul "eu sunt profesor" sau v-a dat si un motiv ?

uite o varianta aici -- https://forum.softpe...iabile-globale/ --
Nu, doar a zis ca se face cu 'for', astfel... nici macar nu m-am gandit la 'if', care este mult mai simplu daca analizezi logic

#11
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,444
  • Înscris: 10.08.2005
Se face cu matematica

ce va opreste sa analizati (logic) o problema ?

"Sa se afiseze (1) cate (2) cifre (3) sunt prime (4) din numarul(5) : 1233405", se va afisa 4 (6)

(1) - metoda de output
(2) - contor
(3) - cifre, model matematic,
(4) - prime, model matematic
(5) - numar arbitrar
(6) - caz de test

(3) - f : N → U*
N - numere naturale
U* - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} (multimea cifrelor in sistemul zecimal)

(4) - f : U* P*
U - cifre in sistemul zecimal
P* - cifre prime { 1, 2, 3, 5, 7}

U si P sunt constante si se poate determina o formula pentru fiecare
nr = n % 10;
noi spunem, te ajuta sa tii minte cu ce lucrezi
cifra = numar %10

if((cifra%2 && cifra != 9) || cifra == 2)
cifra == 2 || (cifra%2 == 1 && cifra%8 != 1)

#include <stdio.h>
int isDigitPrime(int digit)
{
return (digit == 2 || (digit % 2 == 1 && digit % 8 != 1));
}
int numberOfPrimeDigits(int number)
{
size_t count = 0, digit;
while (number) {
	 digit = number % 10;
	 if (isDigitPrime(digit)) {
		 count++;
	 }
	 number /= 10;
}
return count;
}
int main()
{
int numar = 1233405;
printf("%d has %d prime digits\n", numar, numberOfPrimeDigits(numar));
return 0;
}




1 and Prime Numbers - Numberphile

Edited by MarianG, 20 January 2017 - 23:22.


#12
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Eu cred că v-a zis că se face cu for că să scape de voi mai repede.

Dacă vrei să faci programare de profesie, citește răspunsul lui MarianG că ți-a explicat totul foarte bine, începând de la analiza problemei și descompunerea sa în subprobleme până la numirea variabilelor și a funcțiilor - totul foarte curat.

Apoi compară codul lui cu codul tipic "scris în școli" și detașează-te de ce vă învață la școală, că vă învață prost, mai mult vă bagă varză în cap.

Elevii ăia care reușesc să facă performanță, nu reușesc mulțumită sistemului, ci în ciuda lui.

#13
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,665
  • Înscris: 29.08.2013
O soluţie care mi se pare interesantă când vrei să afli dacă o cifră e număr prim (sau se află într-o altă mulţime cunoscută de cifre) este folosind funcţia strchr din biblioteca string.h.
Cifra x se află în mulţimea de cifre {c1, c2, c3, ..., cn} dacă codul ascii al cifrei x (x + '0') se află în şirul de caractere "c1c2c3...cn". În cazul de faţă:

int prime_digit(int digit) {
	  return strchr("2357", digit + '0') != 0;
}

Edited by sftpdt, 25 January 2017 - 23:28.


#14
iulian_1976

iulian_1976

    Active Member

  • Grup: Members
  • Posts: 1,576
  • Înscris: 10.05.2008
Sa o luam metodic,multe sunt ok din codul initial altele nu.
Ideea lui este ok insa nu stie sa o duca la capat,multe notiuni in programare nu sunt prezentate in mod voit sau...din lipsa de cunostine.



1.Legat de codul initial variabilele trebuie initializate ex int k=0,nr=0 etc ;  asta este o regula .
De ce?
Odata ce o vei folosi o variabila intr-o bucla  mari sanse sa ai o eroare de compilare sau variabila sa agate un numar care nu l-ai dorit
2.Eroare provine din acel if care  trebuie testat o singura data pentru un anume nr  insa unde il pozitionezi ? si mai trebuie alte lucruri pe ici pe colo
3..Un cod pe care am incercat sa il fac cat mai lizibil
4.De aici pot incepe zeci de variante,derivatii  de cod cu break; functii pe post de flag etc si de nu functii deja existente in biblioteci Posted Image


#include <iostream>

using namespace std;

int main()
{

int n=1233405; // numarul care trebuie spart in bucati
int nr; // numerele care vor rezulta din folosirea %
int i=0 ; // folosit pentru contor
int k1=0,k2=0; // folosite pentru a numara cate numere prime k1 resp cate numere nu sunt prime k2
int a=0,b=0; // folosite pe post de flag





	 while (n!=0) { // iesire din bucla doar n==0;


				 nr = n % 10; // extragere numar pentru testare

				 a=0; // cand testam nr------a si b trebuie reinitializat la 0;
				 b=0;
				 i=2; // toate numerele se divid cu 1 si cu el insusi=> contor intre 2 si n-1
				 while(i <nr) // testare numar inte 2 si n-1
				 {

					 if (nr%i == 0)
					 {
						 a=1;

					 }
					 if (nr%i != 0)
					 {
						 b=1;

					 }


				 i++;
				 }


				 if(a==0&&b==1 || nr==2) // incrementam cand exista un numar prim & nr 2 este o exceptie
			 {
				 k1=k1+1;

			 }

				 if(a==1&&b==1) // bonus pentru numere care nu sunt prime
			 {
				 k2=k2+1;

			 }







			 n = n / 10;	 // creare noului n,pregatit pentru %


	 }


	 if (k1 > 0)
			 cout << "Nr prime="<<k1;
	 else
			 cout << "nu exista cifre prime";

	 // puteti adauga si variabila k2 care va afisa si numerele care nu sunt prime

return 0;
}





	


Cu respect,
Iulian

Edited by iulian_1976, 26 January 2017 - 15:12.


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