C#的标准库是否有一种简单的方法来检查一个数字是否是另一个数字的幂?

时间:2017-04-27 19:25:28

标签: c# .net algorithm

我正在尝试查看是否有一种很好的方法可以找到int s bn,是否存在a a^n=b { {1}}。换句话说,比我在下面写的坏解决方案更有效率

private static bool HasBase(int b, int n)
{
    for(int a = 1; a <= int.MaxValue; ++a)
    {
        int pow = Power(a, n);
        if(pow == b)
            return true;
        else if(pow > b)
            return false;
    }
    return false;   
}

private static int Power(int a, int n) 
{
    return Enumerable.Range(a, n).Aggregate(1, (prev, cur) => prev * cur);
}

3 个答案:

答案 0 :(得分:3)

它具有Math.log(double,double)函数,该函数在第二个数字的基数中查找第一个数字的日志。如果整体出来,那么它就是一种力量。因此,例如,如果我想知道x是2的幂,我可以写:

bool isAPower = (Decimal)(Math.Log(x,2))%1==0;

换句话说,取x的对数基数2,如果将其除以1则找到余数。如果mod为0则为true,如果它不为0则为false。

答案 1 :(得分:0)

您可以找到__del__的所有因素,并检查相同因素是否仅重复b次或n次。因为xnx^n*y^n = (xy)^n = a^n

x^(2n) = (xx)^n = a^n

答案 2 :(得分:0)

原始问题在标题和文字之间存在差异。假设文本正确,OP希望找到Xab X^a == b。这是一个粗略的算法,可以做到这一点,但它不是整数完美的。使用任何内置数学函数执行此类计算时,将始终显示浮点错误。唯一的选择是执行一些计算密集型循环。

// given
int value = ...;
int power = ...;

// calculate the [power]th root of [value]
var root = value >= 0
    ? Math.Pow(value, 1d / power)
    : Math.Abs(power % 2) == 1
        ? -Math.Pow(-value, 1d / power)
        : Double.NaN;

// determine if [root] is an int
var root_is_int = Math.Abs(root - Math.Round(root)) <= Double.Epsilon;

请注意,除了由舍入错误引起的潜在问题之外,这适用于valuepower的所有值 - 正数,负数和零。