我知道这可能是一个非常简单的问题,但我该怎样做呢 n 2 在编程语言中?
是n * n吗?或者还有另一种方式吗?
答案 0 :(得分:11)
n * n
是最简单的方式。
对于支持取幂运算符的语言(本例中为**
),您也可以执行n ** 2
否则,您可以使用数学库来调用pow(n, 2)
之类的函数,但这可能只是简单地对数字进行平方。
答案 1 :(得分:5)
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。
根据语言的不同,您可能会在Python中使用power
函数,例如pow(n, 2)
in C或math.pow(n, 2)
...因为这些power
函数会转换为浮点数数字,它们在可能出现溢出的情况下更有用。
答案 2 :(得分:2)
有许多编程语言,每种语言都有自己的表达数学运算的方式。
一些常见的将是:
x*x
pow(x,2)
x^2
x ** 2
square(x)
(* x x)
如果您指定特定语言,我们可以为您提供更多指导。
答案 3 :(得分:2)
如果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);
答案 4 :(得分:1)
除非语言具有明确的square
功能,否则始终使用语言的乘法。特别要避免使用大多数数学库提供的pow
函数。乘法将(除非在最极端的情况下)总是更快,并且 - 如果您的平台符合大多数平台所做的IEEE-754规范 - 将提供正确的舍入结果。在许多语言中,没有标准来管理pow
函数的准确性。它通常会为这样一个简单的案例提供高质量的结果(许多库实现将特殊情况平方以节省程序员自己),但你不想依赖于此[1]。
我看到了开发人员编写的大量C / C ++代码:
double result = pow(someComplicatedExpression, 2);
可能是为了避免两次输入复杂的表达式,或者因为他们认为它会以某种方式减慢他们的代码以使用临时变量。它不会。编译器非常非常擅长优化这类事情。相反,写一下:
const double myTemporaryVariable = someComplicatedExpression;
double result = myTemporaryVariable * myTemporaryVariable;
总结:使用乘法。它总是至少与你能做的任何其他事情一样快,至少同样准确[2]。
1)当语言语义允许时,主流平台上的最新编译器可以将pow(x,2)
优化为x*x
。但是,并非所有编译器都在所有优化设置中执行此操作,这是难以调试舍入错误的方法。最好不要依赖它。
2)基本类型。如果您真的想进入它,如果需要在软件中为您正在使用的类型实现乘法,则有一些方法可以使乘法比乘法更快。然而,你几乎不会发现自己处于这种重要的境地。