Я должен увидеть, что из следующего из вектора является квадратным числом, а затем сделать другой вектор только с квадратными числами
Например: (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;
}
но я не совсем уверен, как продолжить
Для этого есть алгоритм:
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
для отрицательных чисел (если вы не хотите использовать комплексные числа, а не только целые числа).
Поскольку вы не знаете заранее, сколько целых чисел введет пользователь или сколько из них на самом деле будет квадратами, вам, вероятно, следует использовать динамическое выделение массива (или, что еще лучше, использовать контейнер, такой как 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;