47 1 + 2 + 3 + ... + Nを求めます

タイトル説明

、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;
}
公開された117元の記事 ウォンの賞賛8 ビュー3706

おすすめ

転載: blog.csdn.net/qq_34761012/article/details/104514995