代码之家  ›  专栏  ›  技术社区  ›  Ozzy

程序设计中的平方数

  •  6
  • Ozzy  · 技术社区  · 15 年前

    我知道这可能是个很简单的问题,但是我该怎么做 n 在编程语言中?

    是N*N吗?还是有别的办法?

    5 回复  |  直到 15 年前
        1
  •  11
  •   Justin Ethier    15 年前

    n * n 是最简单的方法。

    对于支持指数运算的语言( ** 在本例中,您还可以 n ** 2

    否则,可以使用数学库调用 pow(n, 2) 但这可能是对一个数字的简单平方杀伤力。

        2
  •  5
  •   Mark Rushakoff    15 年前

    n * n 几乎总是有效的——在前缀语言(lisp、scheme和co)或后缀语言(forth、factor、bc、dc)中,这两种情况下都不起作用;但是很明显,您可以只编写 (* n n) n n* 分别是。

    当出现溢出情况时,它也将失败:

    #include <limits.h>
    #include <stdio.h>
    int main()
    {
        volatile int x = INT_MAX;
        printf("INT_MAX squared: %d\n", x * x);
        return 0;
    }
    

    我扔了 volatile 上面的量词只是用来指出可以用 -Wall 不会发出任何警告,但在我的32位计算机上 INT_MAX 平方是1。

    根据语言的不同,您可能有 power 功能如下 pow(n, 2) in C math.pow(n, 2) 在python中…自从那些 权力 函数转换为浮点数,在可能溢出的情况下更有用。

        3
  •  2
  •   abelenky    15 年前

    有许多编程语言,每种语言都有自己的数学运算表达方式。

    一些常见的是:

    x*x
    
    pow(x,2)
    
    x^2
    
    x ** 2
    
    square(x)
    
    (* x x)
    

    如果你指定一种特定的语言,我们可以给你更多的指导。

        4
  •  2
  •   zoli2k    15 年前

    如果 n 是一个整数:p:

    int res=0;
    for(int i=0; i<n; i++)
        res+=n; //res=n+n+...+n=n*n
    

    对于正整数,可以使用递归:

    int square(int n){
    if (n>1)
       return square(n-1)+(n-1)+n;
    else 
       return 1;
    }
    

    使用数组分配计算(极度次优):

    #include <iostream>
    using namespace std;
    
    int heapSquare(int n){
       return sizeof(char[n][n]);
    }
    
    int main(){
    for(int i=1; i<=10; i++)
       cout << heapSquare(i) << endl;
    return 0;
    }
    

    使用位移(古埃及乘法):

    int sqr(int x){
       int i=0;
       int result = 0;
       for (;i<32;i++)
          if (x>>i & 0x1)
             result+=x << i;   
       return result;
    }
    

    大会:

      int x = 10;
      _asm_ __volatile__("imul  %%eax,%%eax"
                         :"=a"(x)
                         :"a"(x)
                          );
      printf("x*x=%d\n", x);
    
        5
  •  1
  •   Stephen Canon    15 年前

    始终使用该语言的乘法,除非该语言有显式的 square 功能。特别避免使用 pow 大多数数学库提供的函数。乘法(除了最离谱的情况)总是更快,而且——如果您的平台符合ieee-754规范(大多数平台都是这样做的)——将提供正确的舍入结果。在许多语言中,没有标准来管理 战俘 功能。对于这样一个简单的案例,它通常会给出一个高质量的结果(许多库实现都会对特殊的案例进行平方运算,以将程序员从自身中解救出来),但是您不希望依赖于此[1]。

    我看到开发者编写的大量C/C++代码:

    double result = pow(someComplicatedExpression, 2);
    

    可能是为了避免将复杂的表达式键入两次,或者是因为他们认为使用临时变量会以某种方式减慢代码的速度。不会的。编译器非常非常擅长优化这类事情。相反,写下:

    const double myTemporaryVariable = someComplicatedExpression;
    double result = myTemporaryVariable * myTemporaryVariable;
    

    总结一下:使用乘法。它总是至少和你能做的任何事情一样快,至少一样准确。

    1)主流平台上最新的编译器可以优化 pow(x,2) 进入之内 x*x 当语言语义允许时。但是,并非所有编译器都在所有优化设置下执行此操作,这是一种很难调试舍入错误的方法。最好不要依赖它。

    2)对于基本类型。如果你真的想进入它,如果乘法需要在软件中实现,你正在使用的类型,有办法使平方运算比乘法快。然而,你几乎永远不会发现自己处于这样一个重要的境地。