Определить является ли число 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.