Se consideră algoritmul alăturat descris în
pseudocod.
S-a notat cu [z] partea întreagă a numărului real z.
a) Scrieţi valorile afişate în urma executării
algoritmului, dacă se citeşte numărul n=3.
b) Scrieţi cea mai mică valoare care poate fi citită
pentru n astfel încât, în urma executării
algoritmului, în şirul valorilor afişate să existe cel
puţin 3 numere care au ultima cifră 0 şi care să se
afle pe poziţii consecutive.
citeşte n (număr natural)
┌pentru i←1,n execută
│ p←1
│┌pentru j←i,2,-1 execută
││ p←p*j
│└■
│scrie [p/(i*2)]
└■
c) Scrieţi în pseudocod un algoritm echivalent cu cel dat, în care să se utilizeze o singură
structură repetitivă.
d) Scrieţi programul C/C++ corespunzător algoritmului dat.
Răspunsuri la întrebare
Răspuns de
11
Programul calculeaza toate factorialele i de la 1 pana la n si apoi le scrie pe aceste factoriale impartite la 2*i
unde factorial(i)=1*2*3*4*..*(i-1)*i;
Factorialul se obtine prin a doua structura repetitiva care enumera toate numerele de la i la 2: i,i-1,i-2...4,3,2, si le inmulteste la p=1
atunci devne p=i*(i-1)*(i-2)*..*4*3*2;
Ei bine prin impartirea acestui factorial la 2*i rezulta ca
factorial(i)/(2*i)=(2*3*4*..*(i-1)*i)/2*i=3*4*5*...*(i-1)
Deci practic vei scrie pe ecran produsul numerelor de la 3 pana la i-1 asta pentru i mai mare decat 3
Daca i=1, atunci o sa avem: 1!=1, atunci 1/(2*1)=1/2=0, caci /impartirea iti da operatiunea de cat,
Daca i=2 atunci avem 2!=1*2 atunci 2/(2*2)=2/4=0
Daca i=3 atunci avem 3!=1*2*3=6 si avem 6/(2*3)=1
In rest regula de 3*4*5*..*(i-1) se va respecta
a) Pentru n-3, i poate sa ia valorile scrise mai sus: 1,2,3 deci rezultatele vor fi:
0 0 1
b) Ca sa existe un numar cu ultima cifra 0, trebuie sa includa in termenul de produse o valoare de 5 si un numar par(caci inmultite vor da atunci 10)
in cazul primelor 3 numere, nu este cazul pentru ca avem 0.0 1(nu sunt 3 consecutive de 0)
atunci trebuie sa ne uitam pentru termeni mai mari decat n=3
observam ca pentru n=5, o sa obtinem valoarea afisata 3*(5-1)=3*4
dar pentru valoarea n=6, o sa avem atunci 3*4*(6-1)=3*4*5.
Apoi, cand marim n, pur si simplu o sa se mai adauge inca un numar la sirul din produs. Pentru n=7, o sa avem 3*4*5*6, n=8 o sa avem 3*4*5*6*7
Ceea ce este clar este ca toate de acum inainte o sa aiba 0 la rand. Dar pentru a obtine 3 valori de 0 la rand, acestea sunt pentru pozitiile i=6,7,8, deci pentru n=8
c) facem calculul factorialului direct in prima structura repetitiva
p<-1;
pentru i<-1,n executa
p<-p*i;
scrie [(p/(2*i))]
sfarsit executa
d)
#include <iostream>
using namespace std;
int main(){
int i,j,n,p;
cin>>n;
for(i=1;i<=n;i++){
p=1;
for(j=i;j>=2;j--){
p=p*j;
}
cout<<p/(2*i)<<" ";
}
return 0;
}
unde factorial(i)=1*2*3*4*..*(i-1)*i;
Factorialul se obtine prin a doua structura repetitiva care enumera toate numerele de la i la 2: i,i-1,i-2...4,3,2, si le inmulteste la p=1
atunci devne p=i*(i-1)*(i-2)*..*4*3*2;
Ei bine prin impartirea acestui factorial la 2*i rezulta ca
factorial(i)/(2*i)=(2*3*4*..*(i-1)*i)/2*i=3*4*5*...*(i-1)
Deci practic vei scrie pe ecran produsul numerelor de la 3 pana la i-1 asta pentru i mai mare decat 3
Daca i=1, atunci o sa avem: 1!=1, atunci 1/(2*1)=1/2=0, caci /impartirea iti da operatiunea de cat,
Daca i=2 atunci avem 2!=1*2 atunci 2/(2*2)=2/4=0
Daca i=3 atunci avem 3!=1*2*3=6 si avem 6/(2*3)=1
In rest regula de 3*4*5*..*(i-1) se va respecta
a) Pentru n-3, i poate sa ia valorile scrise mai sus: 1,2,3 deci rezultatele vor fi:
0 0 1
b) Ca sa existe un numar cu ultima cifra 0, trebuie sa includa in termenul de produse o valoare de 5 si un numar par(caci inmultite vor da atunci 10)
in cazul primelor 3 numere, nu este cazul pentru ca avem 0.0 1(nu sunt 3 consecutive de 0)
atunci trebuie sa ne uitam pentru termeni mai mari decat n=3
observam ca pentru n=5, o sa obtinem valoarea afisata 3*(5-1)=3*4
dar pentru valoarea n=6, o sa avem atunci 3*4*(6-1)=3*4*5.
Apoi, cand marim n, pur si simplu o sa se mai adauge inca un numar la sirul din produs. Pentru n=7, o sa avem 3*4*5*6, n=8 o sa avem 3*4*5*6*7
Ceea ce este clar este ca toate de acum inainte o sa aiba 0 la rand. Dar pentru a obtine 3 valori de 0 la rand, acestea sunt pentru pozitiile i=6,7,8, deci pentru n=8
c) facem calculul factorialului direct in prima structura repetitiva
p<-1;
pentru i<-1,n executa
p<-p*i;
scrie [(p/(2*i))]
sfarsit executa
d)
#include <iostream>
using namespace std;
int main(){
int i,j,n,p;
cin>>n;
for(i=1;i<=n;i++){
p=1;
for(j=i;j>=2;j--){
p=p*j;
}
cout<<p/(2*i)<<" ";
}
return 0;
}
Alte întrebări interesante
Matematică,
8 ani în urmă
Chimie,
8 ani în urmă
Limba română,
8 ani în urmă
Matematică,
9 ani în urmă
Spaniola,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă