1. 程式人生 > >禁止使用循環判斷求1+2+3+..n

禁止使用循環判斷求1+2+3+..n

乘除 int 運算符 禁止 通過 abs http 基本 clas

題目描述

求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為假

技術分享圖片

禁止使用循環判斷求1+2+3+..n