タイトル説明
、1 + 2 + 3 + ... +シークnは他、もし、一方、スイッチ、ケースと、このような条件文(A B:?C)のようなキーワード、乗算と除算をするために、使用することができない必要があります。
アイデア解析
- 思考:彼は、その後、Math.pow計算n(nは+ 1)で書いた>> 1、n(nは+ 1)* 1/2であります
- 2思考:答え&&短絡特性を知るために見て兄を。短絡特性を使用して実装する場合は、実現することができるn> 0の関数、再帰的に1 + 2 + ... + N決定されます。
- 三つのアイデア:アイデア高度なバージョンに基づくものは、2の累乗に分割し、= 2 ^ E0 + 2します ^ ^ E2 E1 + 2 ...
そして* B =(2 ^ E0 + 2 ^ E1 + 2 ^ E2 + ...)* B
= B * 2 ^ E0 + B * 2 ^ E1 + B * 2 ^ E2 + ...
=(B << E0)+(B << E1)+ ...
その後、書き込み中に使用することはできません、2の具体的なアイデア多くのトラブルに。
短絡特性:
ようにするには、(式1)&&(式2)の計算結果が真である必要があります。式1、式2が真です。図1は、式が偽の場合、計算結果が真であることができないと判定されたため、式2は、算出されていない、すなわち&&短絡特性です。
(式1)||(式2)は、演算結果を必要とするようにするにはfalseです:式1、式2が偽です。1式が真である場合、式2は、演算結果が偽可能に決定されているので、これはショート動作||特性であり、算出されません。
コードの実装
public static int Sum_Solution(int n) {
int sum = n;
boolean flag = (sum > 0) && ((sum += Sum_Solution(--n)) > 0);
return sum;
}
public static int Sum_Solution1(int n) {
return ((int) Math.pow(n, 2) + n) >> 1;
}
public static int Sum_Solution2(int n) {
int res = 0;
int a = n, b = n + 1;
while (a != 0) {
if ((a & 1) == 1) {
res += b;
}
a >>= 1;
b <<= 1;
}
return res >>= 1;
}
private int multi(int a, int b) {
int res = 0;
//循环体内部, if ((a & 1) == 1), res += b;
boolean flag1 = ((a & 1) == 1) && (res += b) > 0;
a >>= 1;
b <<= 1;
// while (a != 0) {}循环条件
boolean flag2 = (a != 0) && (res += multi(a, b)) > 0;
return res;
}