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
Răspunsuri la întrebare
Răspuns de
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;
}
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;
}
#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;
}
Alte întrebări interesante
Limba română,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă