1

我必须从一个向量中查看以下哪个是平方数,然后制作另一个只有平方数的向量例如:(4,15,6,25,7,81)第二个将是(4,25,81 )

4,25,81 因为 2x2=4 5x5=25 和 9x9=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;

}

但我不确定如何继续

4

2 回答 2

4

有一个算法:

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

您可能需要稍微详细说明一下,例如从 更改intunsigned,或立即返回false负数(除非您想涉及复数,而不仅仅是整数)。

于 2012-12-08T17:06:00.797 回答
0

由于您事先不知道用户将输入多少整数或其中有多少实际上是正方形,因此您可能应该使用动态数组分配(或者甚至更好,使用像 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;
于 2012-12-08T17:02:45.153 回答