【转载】判断一个数是否x的n次幂

原文地址:https://www.namidame.tech/is-power-of-x.html

在日常的生产需求中,经常会出现需要判断一个数是否另一个数的n次幂,最常见的便是判断2的n次幂,4的n次幂,乃至x的n次幂的问题,下面我们来介绍一下这些题目的解决方法。

对于幂次的判断,我们需要用计算机的思维来解决,计算机常用的计数进制不是10进制,而是2进制,8进制,16进制等等,所以我们先从2进制的角度来思考如何解决这类问题。

1. 判断一个数是否2的n次幂

对于2进制数,数的每一位上的值是2的n次方,所以对于每一个2的n次幂数,他的2进制形式只有1位是1,其他位都是0,于是问题就变成了判断一个2进制数是否只有1位为1。而1只有与1相与结果才是1,所以可以通过不断判断最低位是否为1然后进行右移来计算1的个数。

# include <iostream>
using namespace std;

bool isPowerOfTwo(int num)
{
    if(num <= 0)
    {
        return false;
    }
    int oneNum = 0; // 1的个数
    while(num > 0)
    {
        if(num & 1)
        {
            ++oneNum;
        }
        num = num >> 1;
    }
    return oneNum == 1;
}

int main()
{
    cout << isPowerOfTwo(128) << endl; // 1
    cout << isPowerOfTwo(255) << endl; // 0
}

2. 判断一个数是否4的n次幂

判断是否4的次幂可以从判断2的次幂出发,一个数如果是4的n次幂则必然也是2的次幂;其次,可以看出2进制数在偶数位上的值表示的是4的幂数,比如00010000=16=4^2,所以可以在此基础上判断是否偶数位上为1。

# include <iostream>
using namespace std;

bool isPowerOfFour(int num)
{
    if(num <= 0)
    {
        return false;
    }
    int oneNum = 0;         // 1的个数
    int curPos = -1;        // 记录当前位置
    int pos = -1;           // 记录1所在的位置,只有符合2的次幂时pos才指向正确位置
    while(num > 0)
    {
        ++curPos;
        if(num & 1)
        {
            if(pos == -1)
            {
                pos = curPos;
            }
            ++oneNum;
        }
        num = num >> 1;
    }
    return oneNum == 1 && pos % 2 == 0;
}

int main()
{
    cout << isPowerOfFour(-1) << endl;          // 0
    cout << isPowerOfFour(128) << endl;         // 0
    cout << isPowerOfFour(64) << endl;          // 1
    cout << isPowerOfFour(64 + 8) << endl;      // 0
    cout << isPowerOfFour(64 + 4) << endl;      // 0
    cout << isPowerOfFour(16 + 1) << endl;      // 0
    cout << isPowerOfFour(16) << endl;          // 1
}

3. 判断一个数是否某个数x的n次幂的一般算法

可以发现这样的规律,若将某一个数表示成x进制,则每一位都需要x个符号来表示;若x进制的的数只有一个位上的数为1,则这个数是x的n次幂。比如三进制数100的值为1*3^2=9,即3的平方数。
所以判断一个数是否为x的n次幂,只需要将其写成x进制的形式,再判断是否只有1位为1即可。

# include <iostream>
#include<string>
#include<sstream>
using namespace std;

bool isPowerOfX(int base, int num)
{
    if(num <= 0)
    {
        return false;
    }
    int oneNum = 0;
    int mod = 0;
    do{
        mod = num % base;
        num = num / base;
        if(mod != 1 && mod != 0)
        {
            return false;
        }
        else if(mod == 1)
        {
            ++oneNum;
        }
    }while(num > 0);
    return oneNum == 1;
}

int main()
{
    for(int i = 2; i < 10; i++)
    {
        cout << i << "的幂次数:" << endl;
        for(int j = 0; j < 1000; j++)
        {
            if(isPowerOfX(i, j))
            {
                cout << j << " ";

            }
        }
        
        cout << endl << "-----" << endl;
    }
}

用上述函数isPowerOfX可以判断任意正数num是否为base的n次幂,main函数输出了1000以内的2~9的所有幂次数,说明isPowerOfX解决了判断一个数是否为x的n次幂问题。

2的幂次数:
1 2 4 8 16 32 64 128 256 512 
-----
3的幂次数:
1 3 9 27 81 243 729 
-----
4的幂次数:
1 4 16 64 256 
-----
5的幂次数:
1 5 25 125 625 
-----
6的幂次数:
1 6 36 216 
-----
7的幂次数:
1 7 49 343 
-----
8的幂次数:
1 8 64 512 
-----
9的幂次数:
1 9 81 729 
-----

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者: 你很德布罗意
邮箱: namidame@sina.cn
博客地址: https://www.namidame.tech/
原文地址: http://www.namidame.tech/is-power-of-x.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值