【问题标题】:Anybody Knows the Logic To Find Out a Number is Perfect Square or not? [duplicate]有人知道找出一个数字的逻辑是否是完美平方吗? [复制]
【发布时间】:2011-09-25 23:07:21
【问题描述】:

可能重复:
Fastest way to determine if an integer's square root is an integer

有人知道找出一个数字是否是完美平方的逻辑吗? (Other than Newtons Method or Synthetic Division Method)

For Eg:- 4, 16, 36, 64 are Perfect Squares.

我将输入为441,逻辑应该判断它是否是完美正方形。

这是亚马逊面试中提出的一个问题。

我想在没有任何内置函数的情况下这样做

【问题讨论】:

  • 如果诀窍在于输入本身,那么由于 441 在右侧有一个,那么它不可能是完美正方形。
  • @Jalal:什么,像 81 不是? :-)
  • @Jalal - 441 = 21^2。至少检查一下... 此外,取任何以 1 结尾的数字,例如 52941,将其乘以自身,得到一个以 1 结尾的正方形。
  • @regularfry: @Kobi: 我以为那只是 2 的 n 次方。

标签: c#


【解决方案1】:

我要问面试官的第一个问题是,“问题限制是什么?”也就是说,输入的数字可以有多大?如果它足够小,那么您可以预先计算所有完美的正方形并将它们存储在字典中:

IDictionary<long, bool> squares = new Dictionary<long, bool>;
for(long i = 1; i*i <= MAX_NUM; ++i) {
    squares[i*i] = true;
}

然后,要确定一个数字 x 是否是一个完美的正方形,您只需检查 squares[x] 以查看它是否为真。

【讨论】:

    【解决方案2】:

    类似的东西会起作用。

    public Boolean IsSquare(double input)
    {
        double root, product;
        Boolean isSquare,isGTInput;
    
        root = 1;
        product = 0;
        isSquare = false;
        isGTInput = false;
    
        while (!isSquare && !isGTInput)
        {
            product = root * root;
            if (product == input)
                isSquare = true;
            else if (product > input)
                isGTInput = true;
    
            root += 1;
        }
    
        return isSquare;
    
    }
    

    【讨论】:

    • 这会按照我的要求进行吗
    • 对不起,我不明白你在问什么。
    • 当你使用 root*root 时,这会按照我的要求进行吗
    • 我不认为乘法算作“内置函数”。如果你不能使用乘法运算符,那可能是不可能的。
    【解决方案3】:

    没有 Math.Sqrt,甚至没有乘法:

        static bool IsSquare(int n)
        {
            int i = 1;
            for (; ; )
            {
                if (n < 0)
                    return false;
                if (n == 0)
                    return true;
                n -= i;
                i += 2;
            }
        }
    

    请注意,平方是奇数的部分和。 i 取值 1, 3, 5, 7, ...。部分和 1, 1+3=4, 1+3+5=9, ... 是平方。所以在n -= i之后,我们从n的原始值中减去了平方,我们可以将结果与0进行比较。

    【讨论】:

    • 现在试试看,不用加法或乘法:)
    • 不得不说,我很喜欢这个算法。
    • 尽管从快速基准测试来看,使用乘法似乎更快。
    • 惊人的算法,脱帽致敬,伙计。我后悔为什么我讨厌数学:)
    • 我希望我能给你提供数百万的赏金......真的很感激......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2011-09-27
    相关资源
    最近更新 更多