Afiseaza al x-lea numar prim
Last Updated: Apr 04 2018 19:09, Started by
dorian2001
, Oct 27 2017 20:44
·
0
#1
Posted 27 October 2017 - 20:44
Se dă un număr x. Se cere să se afișeze al x-lea număr prim.
Date de intrare Se citește la tastatură numărul x. Date de ieșire Programul va afișa pe ecran al x-lea număr prim. Pentru x=4 afiseaza 7;deci se incepe cu numerele prime de la 2. P.S. Programul sa fie realizat fara vector. |
#2
Posted 27 October 2017 - 21:15
Pseudocod:
creezi o functie checkPrime(int x) care returneaza true sau false. in main : int x; //citeste de la tastatura for(int i =2; i<=cat_vrei_tu;i++){ if(checkPrime(i)){ j++; if(j==x){ print i } } } |
#3
Posted 27 October 2017 - 21:30
y=0;//cand y va fi egal cu x programul se opreste
nr=2; while(y<x) { divizori=0; for(i=1;i<=nr;i++) if(nr%i==0)divizori++; if(divizori==2)//nr este numar prim y++; nr++; } printf(nr-1); Edited by getmorefun, 27 October 2017 - 21:30. |
#4
Posted 27 October 2017 - 22:08
https://godbolt.org/g/ygFf1Y dupa adaptarea codului de aici: https://stackoverflo...at-compile-time
Nu cere de la tastatura si nu afiseaza pe ecran. Tu pui in sursa numarul, iar compilatorul il scrie direct in executabil. Edited by dani.user, 27 October 2017 - 22:24. |
#6
Posted 28 October 2017 - 00:19
dani.user, on 27 octombrie 2017 - 22:08, said:
https://godbolt.org/g/ygFf1Y dupa adaptarea codului de aici: https://stackoverflo...at-compile-time Nu cere de la tastatura si nu afiseaza pe ecran. Tu pui in sursa numarul, iar compilatorul il scrie direct in executabil. Ce se intampla de la aproximativ 500 incolo? |
#7
Posted 28 October 2017 - 00:47
Nu se intampla nimic in mod special.
La ce te referi? https://en.wikipedia...f_prime_numbers Edited by MarianG, 28 October 2017 - 00:49. |
#8
Posted 28 October 2017 - 08:49
Pentru al 400-lea sa zicem, codul in assembly obtinut este:
main: mov eax, 2741 ret Pentru getPrime(500): isPrimeLoop(int, int): mov edx, esi mov eax, 1 imul edx, esi cmp edi, edx jl .L1 .L4: mov eax, edi cdq idiv esi test edx, edx jne .L10 xor eax, eax .L1: rep ret .L10: add esi, 1 mov eax, esi imul eax, esi cmp eax, edi jle .L4 mov eax, 1 ret main: push r14 mov r14d, 5 push r13 mov r13d, 6 push r12 mov r12d, -1431655765 push rbp mov ebp, 499 push rbx mov ebx, 3 .L12: sub ebp, 1 je .L37 .L15: add ebx, 1 test bl, 1 je .L15 cmp ebx, 8 jle .L12 mov eax, ebx mul r12d shr edx lea eax, [rdx+rdx*2] cmp ebx, eax je .L15 cmp ebx, 15 jle .L12 test bl, 3 je .L15 cmp ebx, 24 jle .L12 mov eax, ebx cdq idiv r14d test edx, edx je .L15 cmp ebx, 35 jle .L12 mov eax, ebx cdq idiv r13d test edx, edx je .L15 mov esi, 7 mov edi, ebx call isPrimeLoop(int, int) test al, al jne .L12 jmp .L15 .L37: mov eax, ebx pop rbx pop rbp pop r12 pop r13 pop r14 ret |
#9
Posted 28 October 2017 - 09:02
Compilatorul are o limita pentru evaluarea constexpr. Se poate mari cu -fconstexpr-depth=
|
#10
Posted 28 October 2017 - 09:33
getmorefun, on 27 octombrie 2017 - 21:30, said:
y=0;//cand y va fi egal cu x programul se opreste nr=2; while(y<x) { divizori=0; for(i=1;i<=nr;i++) if(nr%i==0)divizori++; if(divizori==2)//nr este numar prim y++; nr++; } printf(nr-1); Edited by dorian2001, 28 October 2017 - 09:34. |
|
#11
Posted 28 October 2017 - 16:54
for(i=1;i<=nr;i++)
if(nr%i==0)divizori++; aoleu, asa se verifica in ziua de azi daca un numar e prim? Va bate matematica tare. |
#12
Posted 29 October 2017 - 19:03
nu stiu daca mai e nevoie,dar va arat si eu o versiune pascal,e o problema destul de des intalnita si poate mai au si altii nevoie de ea
var i,k,j,x:integer; p:byte; begin read(x); i:=1; k:=2; while i<=x do begin p:=0; for j:=1 to k do if k mod j=0 then p:=1; if p=0 then begin i:=i+1; k:=k+1 end else k:=k+1; end; write(k); end. Edited by salcudean99, 29 October 2017 - 19:14. |
#13
Posted 29 October 2017 - 21:24
Ca să știți și voi: divizorii se verifică până la sqrt (n)
|
#14
Posted 22 March 2018 - 21:26
getmorefun, on 27 octombrie 2017 - 21:30, said:
y=0;//cand y va fi egal cu x programul se opreste nr=2; while(y<x) { divizori=0; for(i=1;i<=nr;i++) if(nr%i==0)divizori++; if(divizori==2)//nr este numar prim y++; nr++; } printf(nr-1); Buna, imi poate explica cineva acest cod, ca la prosti? Sunt nou in programare. In mare parte cred ca am inteles, ce nu reusesc sa inteleg care este treaba cu acel nr = 2 , nr -1 , in principiu variabila nr, ce reprezinta, care este scopul ei si cum functioneaza |
#15
Posted 23 March 2018 - 03:02
Un numar prim are doi divizori, { 1, n }
Daca se gasesc mai multi atunci nu este prim. |
|
#16
Posted 23 March 2018 - 16:02
mstmst, on 22 martie 2018 - 21:26, said:
Buna, imi poate explica cineva acest cod, ca la prosti? Sunt nou in programare. #include <iostream> #include <string> using namespace std; int main(){ int numar = 17; int divizori = 0; for (int i = 1 ; i<= numar; i++) { if (numar % i == 0 ) { //am gasit un divizor if(++divizori > 2) { //daca nr divizorilor este mai mare ca 2 cout<< "nu este prim"; return 0; } } } cout<<"este prim"; return 0; } |
#17
Posted 23 March 2018 - 16:35
cateva observatii:
-n-are rost sa va incalciti in subtilitati de genul "1 si n sunt divizori" sau "nr>2". verificati de la inceput intervalul corect (de la 2 pana la n-1), codul o sa fie mult mai clar -a mai spus cineva, dar fara sa explice: daca X este divizor al lui N, atunci exista Y astfel incat N = X*Y. practic asta inseamna ca nu-i nevoie sa cautati tot intervalul (1, n), ci doar (1, sqrt(n)], unde sqrt(n) = radical din n. asta deoarece in intervalul ( sqrt(n), n) veti gasi doar valorile Y, pe care le-ati fi putut deduce deja atunci cand ati gasit X-ul aferent. -multi ati rezolvat de fapt o alta problema: se cere al X-lea numar prim, nu sa se spuna daca un numar este prim sau nu problema problemei din acest topic este ce optimizari se cer. daca singura restrictie este sa nu se foloseasca vectori, atunci cea mai simpla solutie este cea iterativa: pornesti de la I = 1 si-l incrementezi, apoi verifici daca este nr prim. daca este atunci decrementezi X. cand ai ajuns cu X la 0 te opresti, iar in I o sa ai al X-lea nr prim. problema acestei variante este ca implica un numar foarte mare de calcule, iar pentru valori maricele ale lui X algoritmul o sa dureze o gramada. varianta "corecta", foarte rapida, implica o gramada de matematica. in principiu se foloseste algoritmul Meissel–Lehmer pt a determina pi(x) ( https://en.wikipedia...ehmer_algorithm ). cu functia pi(x) se poate determina un interval foarte mic in care poate fi gasit al X-lea numar prim. |
#18
Posted 23 March 2018 - 18:34
Daca ar intra in aria in care trebuie ar gasi si un grafic pentru
Quote -a mai spus cineva, dar fara sa explice: daca X este divizor al lui N, atunci exista Y astfel incat N = X*Y. practic asta inseamna ca nu-i nevoie sa cautati tot intervalul (1, n), |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users