(C++) Генерация первых p*n совершенных квадратных чисел в массиве (p и n вводятся с клавиатуры)

Я ввод p а также n (int type) числа с моей клавиатуры, я хочу сгенерировать первый p*n квадратные числа в массив pp[99], Вот мой код:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
int i, j, n, p, pp[19];

cout<<"n="; cin>>n;
cout<<"p="; cin>>p;

i=n*p;
j=-1;
while(i!=0)
{
    if(sqrt(i)==(float)sqrt(i))
    {
        j++;
        pp[j]=i;
    }
    i--;
}

for(i=0; i<n*p; i++)
    cout<<pp[i]<<" ";

return 0;
}

Но я сталкиваюсь со следующей проблемой: если я, например, я вхожу p=3 а также n=3, он покажет мне только первые 3 квадратных числа вместо 9, остальные 6 - нули. Теперь я знаю, почему это происходит, просто не знаю, как это исправить (проверяет первый n * p натуральные числа и видя, какие квадраты, не первый n*p квадраты).

Если я возьму i-- и добавить его в if{ } В этом случае алгоритм никогда не завершится, как только он достигнет не квадратного числа (которое будет мгновенным, если только первое, которое он проверяет, не является идеальным квадратом), алгоритм прекратит преуспевать в итерации и будет заблокирован, проверяя то же число бесконечное количество раз.

Есть ли способ это исправить?

1 ответ

Решение

Вместо того, чтобы искать их, генерируйте их.

int square(int x)
{
    return x * x;
}

int main()
{
    int n = 0;
    int p = 0;
    std::cin >> n >> p;
    int limit = n * p;
    int squares[99] = {};
    for (int i = 0; i < limit; i++)
    {
        squares[i] = square(i+1);
    }
    for (int i = 0; i < limit; i++)
    {
        std::cout << squares[i] << ' ';
    }
}
Другие вопросы по тегам