Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
teava rezistenta panou apa calda

Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...

Rezultat RMN
 Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor

Discuții despre TVR Sport HD
 Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android

Recomandare bicicleta e-bike 20&#...
 Bing-Content removal tool

Nu pot accesa monitorulsv.ro de l...

Cum sa elimini urmele de acnee?

Wc Geberit
 

Numere prime!

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

#1
kent94

kent94

    New Member

  • Grup: Members
  • Posts: 22
  • Înscris: 20.01.2014
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

    Trala la la la

  • Grup: Senior Members
  • Posts: 3,944
  • Înscris: 03.08.2008
http://www.cplusplus...rial/functions/

#3
namespace

namespace

    Active Member

  • Grup: Validating
  • Posts: 1,213
  • Înscris: 14.12.2013
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

    Senior Member

  • Grup: Senior Members
  • Posts: 3,042
  • Înscris: 30.10.2006

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: Validating
  • Posts: 1,213
  • Înscris: 14.12.2013

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

    New Member

  • Grup: Members
  • Posts: 22
  • Înscris: 20.01.2014

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: Validating
  • Posts: 1,213
  • Înscris: 14.12.2013

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

    Senior Member

  • Grup: Senior Members
  • Posts: 3,649
  • Înscris: 29.08.2013
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: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
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

    New Member

  • Grup: Members
  • Posts: 22
  • Înscris: 20.01.2014
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

    Senior Member

  • Grup: Senior Members
  • Posts: 3,042
  • Înscris: 30.10.2006
Pentru ca functia prim primeste un int ca parametru, nu un pointer/vector de int-uri.

#12
Tarhi

Tarhi

    Junior Member

  • Grup: Members
  • Posts: 77
  • Înscris: 16.01.2014
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

    Active Member

  • Grup: Members
  • Posts: 1,019
  • Înscris: 31.01.2007
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 Member

  • Grup: Members
  • Posts: 77
  • Înscris: 16.01.2014

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: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007

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

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
[ https://www.youtube-nocookie.com/embed/HvMSRWTE2mI?feature=oembed - Pentru incarcare in pagina (embed) Click aici ]

#17
ccdsah

ccdsah

    Senior Member

  • Grup: Senior Members
  • Posts: 2,581
  • Înscris: 16.03.2013

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

[ https://www.youtube-nocookie.com/embed/HvMSRWTE2mI?feature=oembed - Pentru incarcare in pagina (embed) Click aici ]

Da, dar asa cum zice si el intr-un video anterior e mai greu de implementat decat http://en.wikipedia...._primality_test
[ https://www.youtube-nocookie.com/embed/jbiaz_aHHUQ?feature=oembed - Pentru incarcare in pagina (embed) Click aici ]

#18
alexcrist

alexcrist

    Watchdog

  • Grup: Moderators
  • Posts: 9,258
  • Înscris: 02.02.2006

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?

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

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