在C++中创建一个没有x*x的square()函数

jig*_*bob 8 c++

我是自学C++和Bjarne Stroustrup的"Programming-Principles and Practices Using C++"一书.其中一个"试试这个"问:

在不使用乘法运算符的情况下实现square(); 也就是说,通过重复添加来执行x*x(在0处开始变量结果并将x添加到x次).然后使用该square()运行某个版本的"第一个程序".

基本上,我需要创建一个square(int x)函数,它将返回它的平方而不使用乘法运算符.到目前为止我有这个:

int square(int x)
{
    int i = 0;
    for(int counter = 0; counter < x; ++counter)
    {
        i = i + x;
    }

return i;
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更好的方法来做到这一点.上述功能有效,但我非常确定这不是最好的方法.有帮助吗?

Chr*_*les 5

在我想到这个想法之前,帕特·彼得森就把这个想法从脑子里偷走了.

#include <iostream>

template <typename T>
T square(T x) {
    if(x < 0) x = T(0)-x;
    T sum{0}, s{x};
    while(s) {
        if(s & 1) sum += x;
        x <<= 1;
        s >>= 1;
    }
    return sum;
}

int main() {
    auto sq = square(80);
    std::cout << sq << "\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 你可能意味着古埃及人偷走了这个想法:https://en.wikipedia.org/wiki/Ancient_Egyptian_multiplication (4认同)
  • 一方面,他们是偷窃我的想法的一堆混蛋,另一方面他们的心灵能力是无法想象的强大,比Mats'更多.雅得得尊重. (4认同)
  • 再想一想,在完全阅读维基百科的链接之后,我意识到俄罗斯农民确实偷了你的想法,并且他们自己在几个世纪以前就激励了埃及人. (3认同)

小智 -1

就运行时间复杂度而言,你的实现足够清晰和简单,对于输入n个元素,其运行时间为T(n)=\xce\x98(n)。当然你也可以使用分而治之的方法,假设将n个元素拆分为n/2:n/2,最后递归计算然后将两部分相加,运行时间将类似于\n T(n)=2T(n/2)+\xce\x98(n )=\xce\x98(nlgn),我们可以发现它的运行时间复杂度比你的实现更差。

\n