zoukankan      html  css  js  c++  java
  • 不使用循环或递归判断一个数是否为3的幂(leetcode 326)

    326. Power of Three
    Given an integer, write a function to determine if it is a power of three. Follow up: Could you do it without using any loop / recursion?

    看到这种题目,第一想法就是用递归或者循环来做,但是题目要求了不能用这种方法来做,所以只能另想他法。

    假设输入一个数 n,如果 n 是3的幂,那么 3^x = n, 即 x = log10(n) / log10(3), 这里使用了换底公式。那么这样的话就好办了,如果 n 是3的幂,那么x肯定是一个整数,

    那么接下来只需要判断 x 是不是整数即可。

    判断 x 为整数有两种方法:

    1.将 x 强转为int类型,计算小数位是否为0

    bool isPowerOfThree(int n) {
        double ret = log10(n) / log10(3);
        return ret == (int)ret;
    }

    2.使用fmod函数

    bool isPowerOfThree(int n) {
        double ret = log10(n) / log10(3);
        return n > 0 && fmod(ret, 1) == 0;
    }

    则此题得解。

    我在讨论区也见到一些别的解法,顺便在这里摘录一下(这几种方法的原理都是一样的,因为3是质数,所以3的幂中最大的整数如果能整除 n,那么n = 3 * ... * 3)

    bool isPowerOfThree(int n) {
        return n>0 && 1162261467%n==0;    // 其中的1162261467是3的幂中最大的整数
    }
    bool isPowerOfThree(int n) {
        int maxPowerOfThree = (int)pow(3, (int)(log(INT_MAX)/log(3)));
        return n>0 && maxPowerOfThree%n==0;
    }
    bool isPowerOfThree(int n) {
        return n>0 && (int)pow(3, 19)%n==0;
    }
  • 相关阅读:
    c# CLR无法从 COM 上下文 0x51cd20 转换为 COM 上下文 0x51ce90
    sql语法
    学籍管理系统
    【Android进阶】Android调用WebService的实现
    【Android进阶】自定义控件实现底部扇形展开菜单效果
    华为上机题汇总----java
    卡片游戏(栈和队列)
    18岁生日
    循环多少次?
    Flappy bird源代码(略吊)
  • 原文地址:https://www.cnblogs.com/zhuangshq/p/5683928.html
Copyright © 2011-2022 走看看