как вернуть логический результат? - PullRequest
1 голос
/ 10 октября 2019

class Solution
{
public:
  bool isPowerOfThree (int n)
  {
    double temp = log10 (n) / log10 (3);
      return !(temp - (int) temp);

  }
};

в задаче leetcode 326: Степень три. Если задано целое число, напишите функцию для определения степени три.

Я не знаюЯ не понимаю, как он возвращает логический результат.

Я ожидаю, что кто-то может сказать мне, как понять следующий код: return ! (temp - (int) temp);

Ответы [ 3 ]

1 голос
/ 10 октября 2019

Решение основывается на том, что 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.

1 голос
/ 10 октября 2019

temp - это double, а (int)temp усекает его до int. Допустим, темп равен 1.5, temp - (int)temp равен 0.5. поскольку тип возвращаемого значения bool, функция преобразует результирующее 0.5 в bool !(0.5), которое должно быть false.

Слова из @Nautatava "всего, кроме !(0), !(false) и !(null) дает ложь. Таким образом !(anything other than 0) есть false. "

0 голосов
/ 10 октября 2019

Этот код просто использует целочисленное усечение, чтобы проверить, является ли число temp целым числом. Если это так, то temp - (int)temp будет нулевым. Поскольку это будет означать, что число является степенью три, то унарный оператор «не» ! вернет true. И, конечно, ! для любого ненулевого (истинного) значения будет ложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...