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