Определить является ли число k степенью 3

помогите решить данную задачу ? Определить является ли число k степенью 3.


Ответы (3 шт):

Автор решения: vp_arth

Вот так придумал:

/**
 * Много ложноположительных срабатываний начиная с 450283905890997362
 */
bool is_pow3(unsigned long long num) {
    long double d = logl(num) / logl(3);


    return d - (int) d < 3.46945e-18;
}

bool is_pow3_pow(unsigned long long num) {
    int d = logl(num) / logl(3);


    return num == powl(3, d);
}

Ну или:

static set<unsigned long long> power3{
    1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489,
    1162261467, 3486784401, 10460353203, 31381059609, 94143178827, 282429536481, 847288609443, 2541865828329, 7625597484987, 22876792454961,
    68630377364883, 205891132094649, 617673396283947, 1853020188851841, 5559060566555523, 16677181699666569, 50031545098999707, 150094635296999121,
    450283905890997363, 1350851717672992089, 4052555153018976267, 12157665459056928801u};

bool is_num_power_of_3(unsigned long long num) {
    return power3.count(num);
}
→ Ссылка
Автор решения: Zhihar
bool is_deg3(const int num) {
    int value = 1;

    while ((value < num) && (value < INT_MAX / 3)) {
        value *= 3;
    }

    return value == num;
}

или

bool is_deg3(const int num) {
    int value = num;

    while (value % 3 == 0) {
        value /= 3;
    }

    return value == 1;
}
→ Ссылка
Автор решения: Эникейщик

Перевести в троичную систему и если получится число вида 100..000 (любое количество нулей), то это - степень 3.

→ Ссылка