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

Я ввожу с клавиатуры p и n (тип int) числа, я хочу сгенерировать первые 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 Ответ

0 голосов
/ 29 января 2019

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

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] << ' ';
    }
}
...