👤

Ce este gresit la acest algoritm ? (primesc 20p/100p) Aici este cerinta:
Să se insereze în șir înaintea fiecărui element pătrat perfect rădăcina sa pătrată.
#include
#include
using namespace std;

int main()
{
int n , i,k=1,c;
cin >> n;
int v[n];
for(i=1; i<=n; i++)
{
cin >> v[k];
c=sqrt(v[k]);
if(v[k]/c==c)
{
v[k+1]=v[k];
k++;
}
k++;
}
for(i=1; i {
c=sqrt(v[i]);
if((v[i]/c==c) && (v[i]==v[i-1]))
{
v[i-1]=sqrt(v[i]);
i++;

}

}
for(i=1; i cout<
return 0;
}




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;
}