Răspuns :
Salut
Prima observatie este ca tu limitezi numarul de elemente din vector la numarul de elemente al vectorului original, asta faci prin declaratia
int v[n];
Dar daca adaugi radacina patratului perfect inaintea sa, atunci numarul de elemente initial va fi mai mic decat cel final
Ex: Sa zicem ca pui n=3
si introduci numerele
25 17 16
Atunci rezultatul final ar fi
5 15 17 4 16
Care are 5 elemente. Dar vectorul tau nu le va putea stoca, pentru ca va avea doar 3 elemente.
Deci trebuie sa il declari pe un interval mai mare decat n:
int v[100]; sa zicem. De aceea in probleme de obicei se da limitele lui n pentru a sti cat sa declari vectorii
Apoi mai este o problema. Tu faci verificarea
if(v[k]/c==c) Dar in acest caz, v[k] este nr intreg, c este nr intreg, atunci impartirea dintre numerele intregi va da CATUL, ci nu impartirea propriu zisa
deci daca ai avea sa zicem n=3 si sirul
5 17 16
Raspunsul va fi
2 5 4 17 4 16
De ce? Pentru ca c=sqrt(5)=2.23, dar c fiind un nr intreg, valoarea este convertita la un numar intreg c=2
Deci atunci cand faci impartirea v[k]/c=5/2=2=c e adevarat, si trece la urmatoarea
Pentru a evita aceasta problema, trebuie sa declari vectorul v[k] pe un tip real de tip float
float v[100];
si atunci impartirea devine v[k]/c=5/2=2.5>2, pentru ca c fiind intreg in continuare c=2
Alternativ, poti sa declari pe c drept float, si atunci va avea valoarea corecta a radicalului
float c;
c=sqrt(5)=2.23. Cum preferi
Apoi, in conditia respectiva, faci bine ca transferi elementul pe urmatorul, dar trebuie sa adaugi si radacina patrata in vector
if(v[k]/c==c){v[k+1]=v[k];v[k]=c;k++;}
Aici este codul:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int n,i,k=1,c;
cin >> n;
float v[100];
for(i=1; i<=n; i++)
{
cin >> v[k];
c=sqrt(v[k]);
if(v[k]/c==c)
{
v[k+1]=v[k];
v[k]=c;
k++;
}
k++;
}
for(i=1;i<k;i++){
cout<<v[i]<<" ";
}
return 0;
}
Prima observatie este ca tu limitezi numarul de elemente din vector la numarul de elemente al vectorului original, asta faci prin declaratia
int v[n];
Dar daca adaugi radacina patratului perfect inaintea sa, atunci numarul de elemente initial va fi mai mic decat cel final
Ex: Sa zicem ca pui n=3
si introduci numerele
25 17 16
Atunci rezultatul final ar fi
5 15 17 4 16
Care are 5 elemente. Dar vectorul tau nu le va putea stoca, pentru ca va avea doar 3 elemente.
Deci trebuie sa il declari pe un interval mai mare decat n:
int v[100]; sa zicem. De aceea in probleme de obicei se da limitele lui n pentru a sti cat sa declari vectorii
Apoi mai este o problema. Tu faci verificarea
if(v[k]/c==c) Dar in acest caz, v[k] este nr intreg, c este nr intreg, atunci impartirea dintre numerele intregi va da CATUL, ci nu impartirea propriu zisa
deci daca ai avea sa zicem n=3 si sirul
5 17 16
Raspunsul va fi
2 5 4 17 4 16
De ce? Pentru ca c=sqrt(5)=2.23, dar c fiind un nr intreg, valoarea este convertita la un numar intreg c=2
Deci atunci cand faci impartirea v[k]/c=5/2=2=c e adevarat, si trece la urmatoarea
Pentru a evita aceasta problema, trebuie sa declari vectorul v[k] pe un tip real de tip float
float v[100];
si atunci impartirea devine v[k]/c=5/2=2.5>2, pentru ca c fiind intreg in continuare c=2
Alternativ, poti sa declari pe c drept float, si atunci va avea valoarea corecta a radicalului
float c;
c=sqrt(5)=2.23. Cum preferi
Apoi, in conditia respectiva, faci bine ca transferi elementul pe urmatorul, dar trebuie sa adaugi si radacina patrata in vector
if(v[k]/c==c){v[k+1]=v[k];v[k]=c;k++;}
Aici este codul:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int n,i,k=1,c;
cin >> n;
float v[100];
for(i=1; i<=n; i++)
{
cin >> v[k];
c=sqrt(v[k]);
if(v[k]/c==c)
{
v[k+1]=v[k];
v[k]=c;
k++;
}
k++;
}
for(i=1;i<k;i++){
cout<<v[i]<<" ";
}
return 0;
}
Vă mulțumim că ați vizitat platforma noastră dedicată Informatică. Sperăm că informațiile oferite v-au fost utile. Dacă aveți întrebări sau aveți nevoie de asistență suplimentară, nu ezitați să ne contactați. Așteptăm cu nerăbdare să vă revedem și nu uitați să ne salvați în lista de favorite!