两种方法:
方法一:n^2 相当于 n 个 n 相加,所以可以用加法。
public static int suqare( int n ) {
if (n == 0) {
return 0;
}
if (n < 0) {
n = -n;
}
int sum = n;
for (int i = 1; i < n; i++) {
sum += n;
}
return sum;
}
方法二:
一个整数,不是奇数就是偶数。
假设一个数为 n,
如果 n 为奇数的话,那么 n 可以这样子表示: n = 2 x + 1, 所以 x = (n - 1) ÷ 2 , 在Java里面可以表示为 x = n / 2;
那么 n ^ 2 = (2 x + 1) ^ 2 = 4x^2 + 4x + 1。
一个数乘以2相当于二进制的这个数左移1位,乘以4就相当于左移2位。剩下的x^2再用递归去计算出来,这样子可以实现不用乘法了。
如果n 为偶数的话,那么 n 可以这样子表示: n = 2x,所以x = n/2,跟奇数的情况一样。
那么 n ^ 2 = 4x^2, 同理,这里的乘以4用左移2位,x^2用递归去计算。
而判断一个数是偶数还是奇数,我们可以用这样子: n & 1,因为奇数的最右位为1,偶数为0,所以结果如果是1,那么 n 是奇数,是0的话那么 n 是偶数。
算法实现如下:
public static int square( int n ) {
if ( n == 0 )
return 0;
if ( n < 0 )
n = -n;
int half_n = n / 2;
if ((n & 1) == 1) {
return (square(half_n) << 2) + (half_n << 2) + 1; //这里要注意运算符的优先级问题,+ 比 << 优先, 避免出错,最好用括号括起来。
else
return suqare(half_n) << 2;
}
}