禁止使用循環判斷求1+2+3+..n
阿新 • • 發佈:2018-08-12
乘除 int 運算符 禁止 通過 abs http 基本 clas
所以
擴大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+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)還不是用了好像判斷,乘法,三元運算符都用上了,把這個思路寫上來算是讓自己多了解位運算吧)
1public 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為假
禁止使用循環判斷求1+2+3+..n