算法:不使用乘除,不使用Math类计算一个整形数的平方。
来源:互联网 发布:单片机引脚图 编辑:程序博客网 时间:2024/04/28 06:40
两种方法:
方法一: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;
}
}
- 算法:不使用乘除,不使用Math类计算一个整形数的平方。
- 两个整形数交换的算法,不使用其它变量
- 17-08-07 计算一个数字的立方根,不使用Math方法
- [算法]不使用*、/、+、-、%操作符求一个数的1/
- 算法题:不使用+-×/求一个数的7倍
- 不使用乘除、if、else、while、for, 计算1+2+...+n
- 不使用临时变量而交换两个整形数
- Divide Two Integers 不使用乘除取余求除法
- 不使用循环和乘除算前n项和
- 不使用+-*/计算两个数的和
- 【c语言】不使用+-*/计算两个数的和
- 【计算两数之和】不使用加减乘除
- 不使用临时变量交换两个变量的值(异或,加减,乘除)
- STL:使用模板计算一组整形数的最小值
- 从键盘任意输入一个数,不使用计算绝对值函数编程计算并输出该实数的绝对值
- 对《不使用*、/、+、-、%操作符求一个数的1/3》中算法的理解
- 1.[算法]不使用*、/、+、-、%操作符求一个数的1/3
- [算法]不使用*、/、+、-、%操作符求一个数的1/3
- 【反序表+DP】51Nod1020[逆序排列]题解
- MySQL设计规范
- 4种常见的MySQL日志类型
- 记录数据传输onHttpResponse
- 学习笔记GAN003:GAN、DCGAN、CGAN、InfoGAN
- 算法:不使用乘除,不使用Math类计算一个整形数的平方。
- Jquery 获取对象的几种方式介绍
- CCF考试Java试题--分蛋糕
- 薛文旺个人简历
- iOS hook delegate (一)
- mysql数据库:ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'
- 240. Search a 2D Matrix II
- SVG路径描边动画效果的实现
- 各个数据的范围