Neurochirurgie minim invazivă
"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv. Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice. www.neurohope.ro |
[Tema]Numar divizori a lui d
Last Updated: Dec 13 2014 12:13, Started by
Oklah
, Dec 11 2014 21:03
·
0
#1
Posted 11 December 2014 - 21:03
Salut cum rezolv exercitiul asta ?
Se citește nu număr natural D. Să se afișeze numărul divizorilor naturali ai lui D. (toate numerele întregi >=1 și <=D) la care D se împarte exact. Mi-a explicat profesorul prin email dar nu prea am inteles. "De fiecare dată când găsești un număr i la care se împarte d, o altă variabilă (să zicem nrdiv) crește cu o unitate. i va lua toate valorile întregi de la 1 până la d inclusiv." Codul pe care am incercat sa il fac : #include <iostream> using namespace std; int i, d,nrdiv; int main() { cout << "d = " ; cin >> d ; d = 1; while (i >= 1) { if (i%d==0) cout <<i<<" "; nrdiv++; } return 0; } |
#2
Posted 11 December 2014 - 21:17
Pai ti-a zis profesorul sa iei de la 1 la D. Tu iei de la 1 pana la ... nimeni nu stie, pentru ca-ti intra in ciclu infinit. Ca sa fiu mai clar, iti trebuie o conditie dubla unde sa verifici daca i <= D. Tu il citesti pe d de la tastatura dar dupa iti atribui valoarea 1. Ce rost mai are citirea? Deci nu trebuie sa-i atribui valoarea 1. In acel if trebui sa pui d % i, pentru ca pe numarul d il imparti la i ca sa vezi daca i este divizor al lui d. Daca vrei si sa afisezi pe ecran si sa cresti cu o unitate pe nrdiv atunci trebuie sa folosesti { si }. Si ar mai trebui sa pui in afara while-ului un i++. Ca acum la tine i-ul initial e 0 si 0 ramane. Aaa, si vezi ca i-ul trebuie initial 1.
PS: nu mai folosi variabile globale. |
#3
Posted 11 December 2014 - 21:41
EnachescuAlin, on 11 decembrie 2014 - 21:17, said:
Pai ti-a zis profesorul sa iei de la 1 la D. Tu iei de la 1 pana la ... nimeni nu stie, pentru ca-ti intra in ciclu infinit. Ca sa fiu mai clar, iti trebuie o conditie dubla unde sa verifici daca i <= D. Tu il citesti pe d de la tastatura dar dupa iti atribui valoarea 1. Ce rost mai are citirea? Deci nu trebuie sa-i atribui valoarea 1. In acel if trebui sa pui d % i, pentru ca pe numarul d il imparti la i ca sa vezi daca i este divizor al lui d. Daca vrei si sa afisezi pe ecran si sa cresti cu o unitate pe nrdiv atunci trebuie sa folosesti { si }. Si ar mai trebui sa pui in afara while-ului un i++. Ca acum la tine i-ul initial e 0 si 0 ramane. Aaa, si vezi ca i-ul trebuie initial 1. PS: nu mai folosi variabile globale. 1. Daca pun d%i imi apare o erare in care zice ca , continutul este gresit. [ https://i.imgur.com/KpKOGxS.jpg - Pentru incarcare in pagina (embed) Click aici ] 2. Cum adica sa folosesc {si} ? 3.i++ il pun inainte de return 0 si dupa } ? |
#4
Posted 11 December 2014 - 21:42
Quote De fiecare dată când găsești un număr i la care se împarte d, o altă variabilă (să zicem nrdiv) crește cu o unitate. i va lua toate valorile întregi de la 1 până la d inclusiv." deimpartit, impartitor, cat si rest ca atare toate numerele de la 1 la deimpartit vor fi impartitor iar pentru orice cat al carui rest este zero vei incrementa un contor |
#5
Posted 11 December 2014 - 21:46
Observi ca nu-i dai nicaieri o valoare i'ului dar o citesti cat incape?
Lasa exemplele matematice si pune-te la punct cu bazele limbajului. Edited by dani.user, 11 December 2014 - 21:46. |
#6
Posted 11 December 2014 - 22:32
Oklah, on 11 decembrie 2014 - 21:41, said: 1. Daca pun d%i imi apare o erare in care zice ca , continutul este gresit. [ https://i.imgur.com/KpKOGxS.jpg - Pentru incarcare in pagina (embed) Click aici ] 2. Cum adica sa folosesc {si} ? 3.i++ il pun inainte de return 0 si dupa } ? 1. Pai iti da eroare pentru ca tu acolo ai 1/0 si nu stie sa calculeze... 2. Adica sa folosesti { si } la if la fel cum ai folosit si la while. Iar intre { si } pui cele 2 instructiuni de sub if. 3. i++ il pui intre } de la if si } de la while. |
#7
Posted 11 December 2014 - 23:08
int d,i,nrdiv=0;
for(i=2;i<=n/2;i++) if(d%i==0) nrdiv++; cout<<nrdiv; PS: in cazul programului acestuia ti se calculeaza numarul divizorilor proprii... daca vrei sa pui si 1 si n la socoteala iei i de la 1 la n Edited by darky06, 11 December 2014 - 23:15. |
#8
Posted 12 December 2014 - 05:06
Si daca mergi de la 1 la radacina patrata iti crapa procesorul?
|
#9
Posted 12 December 2014 - 16:40
for(i=1;i<=D;i++) if(D%i==0) nrdiv++;
cout<<nrdiv; cel mai simplu mod.incearca sa intelegi asta si dupa mai lucram la detalii,numarul de la jumatate pana la el insusi nu mai are alti divizori ,deci putem pune o conditie i<=D/2 dar asta mai incolo.intelegi ce am scris mai sus? iti cere numarul divizorilor la final,deci nu ii afisezi pe toti sau la fiecare pas,afisezi finalul,cati divizori a numarat nrdiv. pentru D=6 nrdiv = 4 (1,2,3,6). Edited by VladBtz, 12 December 2014 - 16:42. |
#10
Posted 12 December 2014 - 21:33
http://ro.wikipedia....
cat timp restul este zero, catul si impartitorul sunt divizori deci numeri cate doi, pana la radacina patrata (partea ei intreaga), nu pana la jumatatea sa. pentru deimparit egal cu sase, limita = sqrt(6) = 2 6 mod 1 = 0, 6/1=6 -- adaug 2 divizori 1, 6 6 mod 2 = 0, 6/2=3 -- adaug 2 divizori 2, 3 -------------------------------------- VladBtz, on 12 decembrie 2014 - 16:40, said:
for(i=1;i<=D;i++) if(D%i==0) nrdiv++; cout<<nrdiv; cel mai simplu mod.incearca sa intelegi asta si dupa mai lucram la detalii,numarul de la jumatate pana la el insusi nu mai are alti divizori ,deci putem pune o conditie i<=D/2 dar asta mai incolo.intelegi ce am scris mai sus? iti cere numarul divizorilor la final,deci nu ii afisezi pe toti sau la fiecare pas,afisezi finalul,cati divizori a numarat nrdiv. pentru D=6 nrdiv = 4 (1,2,3,6). 6 mod 1 = 0, 6/1=6 -- adaug 1 divizor 1 6 mod 2 = 0, 6/2=3 -- adaug 1 divizor 2 6 mod 3 = 0, 6/3=2 -- adaug 1 divizor 3 *modulo adica restul impartirii Edited by MarianG, 12 December 2014 - 21:34. |
|
#11
Posted 13 December 2014 - 09:05
Daca in loc de while folosesti for , calculatorul iti va cauta toate numerele din intervalul pe care il dai tu ... de exemplu de la 1 la D.. acestea fiind mai apoi divizorii de care ai tu nevoie.
MarianG , e corect cum i-a spus VladBtz . Asa se rezolva problema . Doar ca intr-adevar mai sunt cateva mici detalii...Gandeste-te ca structura aceea trebuie sa se repete ..poate e corecta si varianta cu sqrt , dar e mai complicata pentru nivelul problemei. |
#12
Posted 13 December 2014 - 10:14
Daca el e la inceput trebuie explicata cat de simplu cu putinta(gen nivel de clasa) ca sa inteleaga.Eu nu am decis sa " o complic" deocamdata cu i<=d/2 pentru ca vreau sa inteleaga ideea,multe ex la clasa se rezolva in modul asta. Marian i-o complici prea mult ,nu ii crapa procesorul dar daca deja e bagat in ceata,nu il scoti cu radacina patrata )Uita-te ca nu stie bine cum se afiseaza,ce cere enuntul si unde se pun acoladele,chiar crezi ca o sa iti inteleaga ideea daca citeste de pe wiki?
Edited by VladBtz, 13 December 2014 - 10:19. |
#13
Posted 13 December 2014 - 12:13
Despre ce structura vorbim? Afisezi doua numere in loc de unul, iar la final, dar chiar la final daca deimpartitul este egal cu catul faci o scadere. Daca imi scapa alt detaliu sunt numai ochi si urechi.
Edited by MarianG, 13 December 2014 - 12:13. |
Anunturi
▶ 1 user(s) are reading this topic
0 members, 1 guests, 0 anonymous users