Вопрос задан 13.01.2026 в 11:26. Предмет Информатика. Спрашивает Назарова Наташа.

Даны натуральное число n и последовательность целых чисел а1, а2,…,аn. Найти количество чисел ai (i=1,2...n), являющихся полными квадратами.

Перейти к ответам

Ответы на вопрос

Отвечает Исаева Александра.

Идея. Число xx является полным квадратом ⇔ x0x \ge 0 и x2=x\lfloor\sqrt{x}\rfloor^2 = x. Отрицательные значения сразу отбрасываем, ноль считается полным квадратом (0 = 020^2).

Алгоритм.

  1. Завести счётчик cnt = 0.

  2. Для каждого aia_i:

    • если ai<0a_i < 0 → не считаем;

    • иначе найти целую часть квадратного корня r=air = \lfloor\sqrt{a_i}\rfloor;

    • если rr=air \cdot r = a_i, увеличить cnt.

  3. Вывести cnt.

Сложность: O(n)O(n) по времени, O(1)O(1) по памяти.


Реализация (Python)

python
import math

n = int(input()) arr = list(map(int, input().split()))

cnt = 0 for x in arr: if x >= 0: r = math.isqrt(x) # целочисленный корень без ошибок округления if r * r == x: cnt += 1

print(cnt)

Реализация (C++, 64-bit)

cpp
#include using namespace std;

int main() { ios::sync_with_stdio(false); cin.tie(nullptr);

int n; if (!(cin >> n)) return 0; long long cnt = 0; for (int i = 0; i < n; ++i) { long long x; cin >> x; if (x >= 0) { long double sr = sqrtl((long double)x); // корень с запасом по точности long long r = (long long)sr; // пол while ((r+1)*(r+1) <= x) ++r; // страховка от погрешностей while (r*r > x) --r; if (r*r == x) ++cnt; } } cout << cnt << "\n"; return 0; }

Замечания.

  • Для очень больших чисел предпочтительнее использовать целочисленный корень (в Python — math.isqrt), чтобы избежать ошибок округления с плавающей запятой.

  • Не забывайте, что 0 и 1 — полные квадраты.

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос