Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Putin ajutor :)

Makestacks.com - Ia platit pentru...

Alegere laptop pentru Browsing &#...

Lipire geam pe rama metalica
 Laptop gaming ~2500 lei

tableta sau card?

Windows, Windows RT, Windows Phon...

O senzatie ciudata
 Sfaturi Achizitionare masini

Inselatorie pe site de vanzari

Placa video da/nu ?

Ponta: "Ordonati, Don Cocos&#...
 SOF sau OF

BICICLETA ELIPTICA Discover o nel...

Vuelta 2014

US OPEN
 

Forumul Softpedia folosește "cookies" pentru a oferi utilizatorilor o experiență completă. Vezi detalii sau închide mesaj (x)

Numere prime!

  • Please log in to reply
20 replies to this topic

#1
kent94

kent94

    Junior

  • Grup: Members
  • Posts: 22
  • Înscris: 20.01.2014
  • ID membru: 844,874

Salut!

Am o problema, eu pentru a afla daca un numar este prim folosesc codul (mai jos este scris), dar nu`l pot folosii in alte situatii,cum ar fi atunci cand mi se cere sa aflu cate elemente sunt prime dintr-un vector.
Ma intereseza si pe mine un algoritm pe care l`as putea folosii in mai multe situatii...

[size=2]#include<stdio.h>
#include<conio.h>[/size]

[size=2]int main(){
	int nr,i,s=0;
   
	printf("Dati numarul:"); scanf("%d",&nr);
   
	for(i=1;i<=nr;i++){
		if(nr%i==0){
		  s=s+1;
		}
	}
	 if(s==2){
	   printf("Numarul %d este prim!",nr);
	 }
		else
			printf("Numarul %d nu este prim!",nr);
		   
		   
		   
			getch();
			return 0;
			}[/size]



#2
yonut_a

yonut_a

    Active Member

  • Grup: Senior Members
  • Posts: 2,374
  • Înscris: 03.08.2008
  • ID membru: 355,695
  • Locație: Iasi
http://www.cplusplus...rial/functions/

#3
namespace

namespace

    Active Member

  • Grup: Members
  • Posts: 1,056
  • Înscris: 14.12.2013
  • ID membru: 838,771
  • Locație: Complex plane
Scrie o funcție de verificare a numărului prim x transmis ca parametru:

bool primChk(int x)
{
int s=0;
for(int i=1; i<=x; i++)
{
if(x%i==0)
s++;
}
if(s==2)
return 1; // x este prim
else return 0; // x nu este prim
}


Asta e baza; în funcție de cerința problemei pui diferite condiții ce depind de ceea ce vrei să calculezi.

#4
tatarduka

tatarduka

    Active Member

  • Grup: Senior Members
  • Posts: 2,654
  • Înscris: 30.10.2006
  • ID membru: 105,911
  • Locație: Timisoara

View Postnamespace, on 21 ianuarie 2014 - 19:35, said:

Asta e baza; în funcție de cerința problemei pui diferite condiții ce depind de ceea ce vrei să calculezi.
Cred ca e cea mai ineficienta metoda de a stabili daca un numar e prim sau nu.

#5
namespace

namespace

    Active Member

  • Grup: Members
  • Posts: 1,056
  • Înscris: 14.12.2013
  • ID membru: 838,771
  • Locație: Complex plane

View Posttatarduka, on 21 ianuarie 2014 - 20:01, said:

Cred ca e cea mai ineficienta metoda de a stabili daca un numar e prim sau nu.

De acord cu tine, am preluat codul propus de inițiator și l-am scris în cadrul unui subprogram, atâta tot.

Edited by namespace, 21 January 2014 - 20:08.




#6
kent94

kent94

    Junior

  • Grup: Members
  • Posts: 22
  • Înscris: 20.01.2014
  • ID membru: 844,874

View Postnamespace, on 21 ianuarie 2014 - 20:07, said:

De acord cu tine, am preluat codul propus de inițiator și l-am scris în cadrul unui subprogram, atâta tot.

Daca imi puteti da un alt algoritm prin care pot afla daca un numar este prim sa nu ar fi cel mai bine...

#7
namespace

namespace

    Active Member

  • Grup: Members
  • Posts: 1,056
  • Înscris: 14.12.2013
  • ID membru: 838,771
  • Locație: Complex plane

View Postkent94, on 21 ianuarie 2014 - 20:10, said:

Daca imi puteti da un alt algoritm prin care pot afla daca un numar este prim sa nu ar fi cel mai bine...

Poftim:

bool primChk(int x)
{
for (int i = 2; i < sqrt(x); i++)
{
  if (x%i == 0)
  {
   return 0;
   break;
  }
}
return 1;
}


Edited by namespace, 21 January 2014 - 20:24.


#8
sftpdt

sftpdt

    Member

  • Grup: Members
  • Posts: 857
  • Înscris: 29.08.2013
  • ID membru: 823,128
Uite un cod cât de cât optimizat:

#include <stdio.h>
#include <math.h>
int main(void)
{
	int n,d,ok;
	printf("n=");
	scanf("%d",&n);
	if (n%2==0)
	{
		if (n==2)
			printf("Este prim");
		else
			printf("Nu este prim");
	}
	else
	{
		d=3;
		ok=1;
		while (d<=sqrt(n) && ok==1)
			if (n%d==0)
				ok=0;
			else
				d=d+2;
		if (ok==1)
			printf("Este prim");
		else
			printf("Nu este prim");
	}
	return 0;
}


Edited by sftpdt, 25 January 2014 - 09:08.


#9
dani.user

dani.user

    Guru Member

  • Grup: Moderators
  • Posts: 16,137
  • Înscris: 24.02.2007
  • ID membru: 146,987
Problema ta nu e de ce un algoritm e mai bun decat altul sau care-i cel mai bun.
Problema ta, asa cum ai cerut, e ca nu stii inca cum sa refolosesti codul fara sa-l rescrie .
Ti s-a si raspuns pentru asta, sa inveti sa scrii functii.

#10
kent94

kent94

    Junior

  • Grup: Members
  • Posts: 22
  • Înscris: 20.01.2014
  • ID membru: 844,874

Revin...Uite am scris un cod pentru a afla care numere sunt prime dintr-un vector... Am o eroare,nu inteleg cu ce gresesc,dar banuiesc ca este o greseala atunci cand apelez functia prim.
As vrea, daca se poate, sa imi explice si mie cineva, cum trebuie sa fac,de citit am citit despre functii, am cautat si exercitii asemanatoare cu functii, dar nu gasesc...

#include<stdio.h>
#include<conio.h>
void citire(int n,int x[]){
	 int i;
	
	 for(i=0;i<n;i++){
	 printf("x[%d]=",i);
	 scanf("%d",&x[i]);
	 }
}
void afisare(int n,int x[]){
	 int i;
	
	 for(i=0;i<n;i++){
	 printf("%d ",x[i]);
	 }
}			
int prim(int r){
	 int i,s=0;
	
	 for(i=1;i<=r;i++){
	 if(r%i == 0){
		 s=s+1;
	 }
	 }
return s;
}					
	
	
int main(){
int x[100],n,m,r,s,i;

printf("n="); scanf("%d",&n);

citire(n,x);
afisare(n,x);

for(i=0;i<n;i++){
	 if( prim(x) == 2 ){
		 printf("%d este prim!",x[i]);
	 }
}
						
getch();
return 0;
}


Am gasit greseala, era la ultimul for, trebuia:

for(i=0;i<n;i++){
		 if( prim(x[i]) == 2 ){
				 printf("%d este prim!",x[i]);
		 }
}
Dar nu inteleg de ce trebuie pus prim(x[i]) cand apelez functia si nu se pune prim(x)..Imi poate explica cineva?Posted Image

Edited by kent94, 31 January 2014 - 13:44.


#11
tatarduka

tatarduka

    Active Member

  • Grup: Senior Members
  • Posts: 2,654
  • Înscris: 30.10.2006
  • ID membru: 105,911
  • Locație: Timisoara
Pentru ca functia prim primeste un int ca parametru, nu un pointer/vector de int-uri.

#12
Tarhi

Tarhi

    Junior

  • Grup: Members
  • Posts: 77
  • Înscris: 16.01.2014
  • ID membru: 844,142
if( prim(x) == 2 ){
				 printf("%d este prim!",x[i]);
		 }
Deci daca variabila s e egala cu 2 (adica daca 2 numere sunt prime) , doar atunci numarul e prim?

Sper sa te ajute, varianta mea :
#include <iostream>
using namespace std;
int prim (int nr) // verifica daca numarul e prim
{
int d;
if (nr<2)
	 return 0;
else
{
	 for (d=2;d<=nr/2;d++)
		 if (nr%d==0)
			 return 0;
	 return 1;
}
}
int nr_prim (int n, int a[]) // cate numere prime sunt
{
int s=0;
for (int i=1;i<=n;i++)
	 if (prim(a[i]))
		 s++;
return s;
}
void prelucrare (int n, int a[])
{
cout<< " Vectorul are "<< nr_prim (n,a) << " numere prime " << endl;
}
int main ()
{
int n, i, a[30];
cout<<" n = ";
cin>>n;
cout<< " Vectorul = ";
for (i=1;i<=n;i++)
	 cin>>a[i];
prelucrare(n,a);
return 0;
}


Daca nu intelegi ceva, nu ezita sa intrebi.

Edited by Tarhi, 31 January 2014 - 13:50.


#13
G1q

G1q

    Member

  • Grup: Members
  • Posts: 516
  • Înscris: 31.01.2007
  • ID membru: 135,771
  • Locație: Bucuresti
Pentru ca X este vectorul, iar X[i] este elementul pe care il testezi, in prima faza tu testai doar denumirea vectorului, nu un element al sau. Si ti s-a mai zis in topic, este foarte ineficienta functia ta de testare a unui numar prim.
Alta cale: mergi cu un for de la 2 la radical din numarul testat, daca ai gasit un numar in acest interval la care sa se imparta exact nr. testat atunci el este prim.

View Postnamespace, on 21 ianuarie 2014 - 20:18, said:

Poftim:
bool primChk(int x)
{
for (int i = 2; i < sqrt(x); i++)
{
if (x%i == 0)
{
return 0;
break;
}
}
return 1;
}


@Tarhi: numarul este prim daca se imparte doar la el (s++ // s=1) si la 1 (s++ // s=2) . Asta e logica ...

Edited by G1q, 31 January 2014 - 13:52.


#14
Tarhi

Tarhi

    Junior

  • Grup: Members
  • Posts: 77
  • Înscris: 16.01.2014
  • ID membru: 844,142

Quote

@Tarhi: numarul este prim daca se imparte doar la el (s++ // s=1) si la 1 (s++ // s=2) . Asta e logica ...
In loc de "==" am vazut pe moment "=", greseala mea. Mersi de atentionare !

#15
dani.user

dani.user

    Guru Member

  • Grup: Moderators
  • Posts: 16,137
  • Înscris: 24.02.2007
  • ID membru: 146,987

View Postkent94, on 31 ianuarie 2014 - 13:26, said:

As vrea, daca se poate, sa imi explice si mie cineva, cum trebuie sa fac,de citit am citit despre functii, am cautat si exercitii asemanatoare cu functii, dar nu gasesc...

O functie trebuie sa faca un lucru, atat. Tu insa incerci sa faci prea multe lucruri deodata.
Pana sa verifici cate valori dintr-un vector sunt prime, faci o functie care verifica daca o valoare e prima sau nu, functie careia ii dai o valoare drept parametru si care returneaza 0 sau 1 (fals, adevarat) daca acel parametru e prim sau nu.
Abia dupa ce ai functia asta ce iti da raspunsul pentru un numar, n-ai decat sa scrii alta care primeste un vector drept parametru si care o apeleaza pe prima pentru fiecare valoare din vector.

#16
MarianG

MarianG

    ˈtwɪtə(r) [Cereal chilăr]

  • Grup: Senior Members
  • Posts: 10,212
  • Înscris: 10.08.2005
  • ID membru: 43,530
  • Locație: Iasi


#17
ccdsah

ccdsah

    Junior

  • Grup: Members
  • Posts: 341
  • Înscris: 16.03.2013
  • ID membru: 803,418

View PostMarianG, on 03 februarie 2014 - 19:54, said:



Da, dar asa cum zice si el intr-un video anterior e mai greu de implementat decat http://en.wikipedia...._primality_test


#18
alexcrist

alexcrist

    Watchdog

  • Grup: Moderators
  • Posts: 4,946
  • Înscris: 02.02.2006
  • ID membru: 64,205
  • Locație: Galați/Iași, România

View PostTarhi, on 31 ianuarie 2014 - 13:49, said:

if( prim(x) == 2 ){
				 printf("%d este prim!",x[i]);
		 }
Deci daca variabila s e egala cu 2 (adica daca 2 numere sunt prime) , doar atunci numarul e prim?

View Postdani.user, on 31 ianuarie 2014 - 15:39, said:

Pana sa verifici cate valori dintr-un vector sunt prime
Din câte înțeleg eu din cod, el nu numără câte numere sunt prime în vector. Ci numără câți divizori are un număr. Dacă numărul de divizori este 2, atunci numărul este prim, ceea ce e corect (mă rog, exceptând pentru 1, care are un singur divizor). Nu văd unde numără câte numere sunt prime în vector. Îmi scapă ceva?

Reclamă

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users