Является ли заданное число степенным?

Plyushka

Число n называется степенным, если его можно получить из некоторого числа умножением на себя хотя бы один раз. Например, 4 степенное число, так как 4=2•2, 27 тоже степенное число, так как 27=3•3•3, а 28 не является степенным числом. Определить являются ли заданные числа степенными. Входные данные Первая строка входного файла INPUT.TXT содержит натуральное число n - количество исследуемых чисел (1 ≤ n ≤ 10). Во второй строке через пробел записаны n чисел - исследуемые числа. Каждое из них больше 1 и меньше 109. Выходные данные В выходной файл OUTPUT.TXT выведите n строк. В i-й строке должно быть записано «YES», если i-е число является степенным и «NO» в противном случае Пример - YES; 27 28 - NO;
5 ответов

Plyushka

Неудачный пример. И задачка примитивная. Для всех чисел от 1 до n Для всех i от 2 до корень из n Пока не превзошли число умножать i само на себя вывести yes, если получили само число, иначе вывести no


Plyushka

Можете написать решение я не до конца понял.


Plyushka

Нет, не стану. помощь - бесплатно , а работа за кого-то только за деньги


Plyushka

кот Бегемот, вы правы, что не надо решение писать, но можно чуть-чуть получше объяснить, что вы написали.
Для всех i от 2 до корень из n
По моему это неправильно. Возьмём n=6. 6=3*3 и ответ yes, а вы написали i от 2 до корня из n, а 3*3 больше 6. Поэтому если написать программу как вы написали, то будет ответ n, а должно быть yes.А, извиняюсь, какой я глупый, 3*3 будет 9, а не 6, извините, тогда все правильно. Грубейшая у меня ошибка.кот Бегемот, я написал программу по вашим словам, отправил своё решение в acmp и мне сайт пишет lime limit 7(время 1,372). Написал своё решение через логарифм с известным основанием степени и у меня зашло за 0,001. Вот моя программа, которую я написал по вашим словам:
#include <iostream>
using namespace std;
int main() {
    int n, k;
    for (cin >> n; cin >> k;) {
        int l = 0;
        for (int i = 2; i*i <= k; i++) {
            int d = i;
            while (d<k) d *= i;
            if (d == k) {
                l = 1;
                break;
            }
            else l = 0;
        }
        cout << (l ? "YES\n" : "NO\n");
    }
}
А вот моя программа, которая всё прошла и работает за 0,001:
#include <iostream>
using namespace std;
****** lo(int a, int b) {
    return log(a) / log(b);
}
int main() {
    int n, k, b;
    for (cin >> n; cin >> k;) {
        int b = 2, l = 0;
        while (b*b<= k) {
            if (lo(k,b) == (int)lo(k,b)) {
                l = 1;
                break;
            }
            b++;
        }
        cout << (l ? "YES\n" : "NO\n");
    }
}
Прошу прощения за то, что я пишу на с++. Я паскаль не учил, сразу на с++ начал.


Plyushka

msz301005, так и задавайте вопрос в C++, чего Вы в паскале забыли?Тема перенесена из Turbo Pascal.