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 |
Backtracking prob
Last Updated: Dec 08 2016 23:08, Started by
Slipped
, Dec 04 2016 21:19
·
0
#1
Posted 04 December 2016 - 21:19
Buna seara! Am si eu o problema care nu imi da pace : Se dă un număr natural s. Determinați, toate modalitățile de a-l scrie pe s ca produs de divizori proprii distincți ai lui s.
Exemplu: s=30 5 6 2 3 5 2 15 3 10 Asta e codul meu : #include<iostream> using namespace std; int x[100],s,p=0,v[100],ps; void afisare(int k) { for(int i=0;i<k;i++) cout<<v[x[i]]<<" "; cout<<endl; } int valid(int k) { int i; if(k>1) if(x[k]<=x[k-1]) return 0; ps=1; for(i=0;i<k;i++) { ps=ps*v[x[i]]; } if(ps>s) return 0; return 1; } void back(int k) { for(int val=1;val<=p;val++) { x[k]=val; if(valid(k)) if(ps==s) afisare(k); else back(k+1); } } int main() { int i,d=2; cin>>s; if(s<=1) cout<<"nu exista"; else { while(d<=s/2) { if(s%d==0) { v[p]=d; p++; d++; } else d++; } } back(1); }si imi afiseaza : 2 3 5 / 2 3 5 / 2 3 5/ 2 3 5/ 2 15 , de ce? Unde am gresit? |
#2
Posted 05 December 2016 - 10:08
In C/C++, Java, C#, ... indexarea se face incepand cu 0.
Daca vrei sa folosesti alta indexare (ceea ce deja ridica foarte multe semne de intrebare), atunci macar trebuie sa fii consistent. void back(int k) { for(int val=1;val<=p;val++) { x[k]=val;Aici pare sa folosesti indexare de la 1, insa sirul de divizori l-ai indexat de la 0!! if(k>1) if(x[k]<=x[k-1]) return 0; ps=1; for(i=0;i<k;i++) { ps=ps*v[x[i]]; }Faci verificarea ca si cum ai avea elemente de la 1 la k, dar produsul il faci de la 0 la k-1. Iti sugerez sa schimbi tot codul astfel incat indexarea sa fie cea naturala in C/C++. Prima sugestie: for(int val=0;val<=p;val++) { x[k]=val; |
#3
Posted 05 December 2016 - 10:57
Incearca sa expui in cateva cuvinte (sau in pseudocod) cum te-ai gandit sa rezolvi problema. Daca e corect poti analiza restul problemelor (indici, vectori etc). Daca ai deja clar in minte cum trebuie sa se comporte algoritmul tau ia creion si hartie, alege un numar pentru care cunosti rezultatul si urmareste pas cu pas ce se intampla cand rulezi debugger-ul.
Asa la prima vedere sunt multe chestii care se pot imbunatati, dar important e sa ai clar in minte pasii algoritmului propus de tine. Edited by soarce, 05 December 2016 - 10:58. |
#4
Posted 06 December 2016 - 17:43
Pornesti programul sub debugger si-ti arata pas cu pas ce se intampla pentru a putea observa unde o ia pe aratura.
|
#5
Posted 08 December 2016 - 23:08
Cy_Cristian, on 05 decembrie 2016 - 10:08, said:
In C/C++, Java, C#, ... indexarea se face incepand cu 0. Daca vrei sa folosesti alta indexare (ceea ce deja ridica foarte multe semne de intrebare), atunci macar trebuie sa fii consistent. void back(int k) { for(int val=1;val<=p;val++) { x[k]=val;Aici pare sa folosesti indexare de la 1, insa sirul de divizori l-ai indexat de la 0!! if(k>1) if(x[k]<=x[k-1]) return 0; ps=1; for(i=0;i<k;i++) { ps=ps*v[x[i]]; }Faci verificarea ca si cum ai avea elemente de la 1 la k, dar produsul il faci de la 0 la k-1. Iti sugerez sa schimbi tot codul astfel incat indexarea sa fie cea naturala in C/C++. Prima sugestie: for(int val=0;val<=p;val++) { x[k]=val; |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users