Informatică, întrebare adresată de feherdarius, 9 ani în urmă

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



artur99: De fapt, nici nu e nevoie să pui în vector. De ce nu, pur și simplu, scrii vectorul, apoi când îl afișezi faci verificarea, iar dacă trebuie mai afișezi ceva înainte? :D
blindseeker90: Artur, ca de obicei, multumim pentru toolul tau fabulos

Răspunsuri la întrebare

Răspuns de blindseeker90
6
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;
}

feherdarius: Buna observatia cu nr de elemente.. nu am observat o .. si la fel si aia cu float... nu m-am gandit la exemplul ala .. stiam ca o converteste intr-un numar intreg, dar ma gandeam ca nu e egal cu c..
feherdarius: Cu radacina patrata nu am inteles ce nu e bine? O data 'pun radacina patrata din v[I] si dupa afisez v[I]
feherdarius: Cu radacina patrata nu am inteles ce nu e bine? O data 'pun' radacina patrata din v[I] si dupa 'pun' v[I]
blindseeker90: Este o metoda ineficienta. Practic, tu parcurgi vectorul de doua ori: o data sa muti patratele perfecte pe urmatoarea pozitie, si a doua parcurgere(al doilea for) pentru a adauga radacinile patratelor. Mai simplu ar fi sa faci operatia in primul for, asa cum am facut in codul de mai sus.
feherdarius: Ok, mersi mult!
ionutg38: #include <iostream>
#include <cmath>
using namespace std;

int pp(int x)
{
if((int)sqrt(x)*(int)sqrt(x)==x)
return 1;
return 0;
}

int main()
{
long int u[51],v[26],i,j,n;
cin>>n;
for(i=1;i<=n;i++)
cin>>v[i];
j=0;
for(i=1;i<=n;i++)
{
if(pp(v[i])==1)
u[++j]=(int)sqrt(v[i]);
u[++j]=v[i];
}
for(i=1;i<=j;i++)
cout<<u[i]<<' ';
return 0;
}
ionutg38: solutia corecta
Alte întrebări interesante