Решение основывается на том, что temp
- это целое число, когда n
- это некоторая степень 3
, а temp
- это число с некоторым дробным значением, когда n
не является степенью 3
.
Допустим, n
- это 9
.
Тогда temp
будет 2.0
.
Тогда (temp-(int)temp)
будет 0
и !(temp-(int)temp)
будет true
.
Допустим, n
равно 10
.
Тогда temp
будет 2.0959
.
Тогда (temp-(int)temp)
будет 0.0959
и !(temp-(int)temp)
будетbe false
.
К сожалению, вычисления с плавающей запятой не настолько точны. Будет лучше использовать:
double temp = log10 (n) / log10 (3);
double diff = (temp - (int) temp);`
return (std::abs(diff) < tolerance);
, где tolerance
может быть небольшим числом, например 1.0E-6
.
Update
Мой эксперимент с cygwin /g ++ на моем компьютере и на ideone.com предполагает, что допуск может быть 1.0e-6
для большого набора чисел, но для INT_MAX он должен быть почти 1.0e-11
или меньше. См https://ideone.com/BgnQxV.