Массивы C ++ выбирают квадратное число и создают новый вектор

Я должен увидеть, что из следующего из вектора является квадратным числом, а затем сделать другой вектор только с квадратными числами
Например: (4,15,6,25,7,81) второй будет (4,25,81)

4,25,81, потому что 2×2 = 4 5×5 = 25 и 9×9 = 81

Я начал так:

{

int A[100],n,r,i;
cout<<"Number of elements=";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]=";
cin>>A[i];
}
for(i=1;i<=n;i++)
{
r=sqrt(A[i]);
if(r*r==A[i])}

return 0;

}

но я не совсем уверен, как продолжить

1

Решение

Для этого есть алгоритм:

std::copy_if(inputs.begin(), inputs.end(), std::back_inserter(squares),
[](int N) {int s=(int)sqrt(N); return s*s==N; });

Возможно, вы захотите уточнить это немного, например, изменить int в unsignedили сразу же возвращаясь false для отрицательных чисел (если вы не хотите использовать комплексные числа, а не только целые числа).

4

Другие решения

Поскольку вы не знаете заранее, сколько целых чисел введет пользователь или сколько из них на самом деле будет квадратами, вам, вероятно, следует использовать динамическое выделение массива (или, что еще лучше, использовать контейнер, такой как std :: vector).

int A[],n,r,i, numSquares = 0;
cout<<"Number of elements=";
cin>>n;

if(n>MAX_NUMBERS) {
// error: user wants to enter too many integers
}

A = new[n];  // dynamically allocate array

for(i=0;i<n;i++)  // array indexing ranges from 0 to n-1
{
cout<<"A["<<i<<"]=";
cin>>A[i];
}
for(i=0;i<n;i++)
{
r=sqrt(A[i]);
if(r*r!=A[i]) {  // A[i] is not a square, "erase" it
A[i] = INT_MAX;
} else {
++numSquares;  // A[i] is a square, leave it alone
}
}

// collect all squares not "erased" in a new array
int squares[] = new int[numSquares], j=0;
for(int i=0; i<n; i++)
if(A[i]!=INT_MAX)
squares[j++] = A[i];

delete [] A;
delete [] squares;
0