题目描述
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
思路:
看到这一题的时候,不能使用乘除法和循环判断,当时就想到了使用二进制移位的方法,因为二进制不就只有加法操作,而且所有的计算在计算机里都是二进制操作。
首先:1+2+3+..+n = n(1+n)/2
其次需要了解一下二进制相关性质:
二进制数左移或右移N位等于扩大或缩小2的N次方倍
2进制的基数为2
所以
扩大10倍,相当于×2
缩小10倍,相当于÷2
扩大一倍,相当于x2的1次方
即左移或右移N位等于扩大或缩小2的N次方倍
现在把上面的求和公式变一下 =n2 + n 再根据上面的性质可得 n2次方幂+n 是1+2+3..+n的2的1次方倍,所以把结果想右移一位即可。
(PS:虽然可以通过,但发现我跑题了,Math.pow(n, 2)还不是用了好像判断,乘法,三元运算符都用上了,把这个思路写上来算是让自己多了解位运算吧)
1 public class Solution { 2 public int Sum_Solution(int n) { 3 4 int res=(int)(Math.pow(n, 2)+n); 5 6 res=res>>1; 7 return res; 8 9 } 10 }
也附上pow函数的算法,作为巩固
1 public class Solution { 2 public double Power(double base, int exponent) { 3 4 double res = 1; 5 6 int p = Math.abs(exponent); 7 8 while (p != 0) { 9 10 if ((p & 1) != 0) { 11 12 res *= base; 13 14 } 15 base *= base; 16 p >>= 1; 17 } 18 19 return exponent < 0 ? 1 / res : res; 20 21 } 22 }
下面这种方法是摘录过来的,运用了 逻辑运算符 &&,想法很好。
1
.需利用逻辑与的短路特性实现递归终止。
2
.当n==
0
时,(n>
0
)&&((sum+=Sum_Solution(n-
1
))>
0
)只执行前面的判断,为
false
,然后直接返回
0
;
3
.当n>
0
时,执行sum+=Sum_Solution(n-
1
),实现递归计算Sum_Solution(n)。
1 public int Sum_Solution(int n) { 2 int sum = n; 3 boolean ans = (n>0)&&((sum+=Sum_Solution(n-1))>0); 4 return sum; 5 }
给自己做个笔记:
1、逻辑运算的短路特性:
(表达式1)&&(表达式2) 如果表达式1为假,则表达式2不会进行运算,即表达式2“被短路”
(表达式1)||(表达式2) 如果表达式1为真,则表达式2不会进行运算,即表达式2“被短路”
2:逻辑运算和位运算(之前真没注意二者的细致区别,好像还混用了 & &&)
位运算符
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:
逻辑运算符
下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假
原文地址:https://www.cnblogs.com/Octopus-22/p/9461533.html