Jianzhi オファー (C++)-JZ64: 1+2+3+...+n の検索 (アルゴリズム ビット演算)

著者: Zhai Tianbao Steven
著作権表示: 著作権は著者に属します。商業的転載の場合は、許可について著者に連絡してください。非商業的な転載の場合は、出典を示してください。

タイトル説明:

1+2+3+...+nを求めるには、乗除算、for、while、if、else、switch、case、条件判定文(A?B:C)などのキーワードを使用しない必要があります。 。

データ範囲:0<n≤200
アドバンスト:空間計算量 O(1)、時間計算量 O(n)

例:

入力:

5

戻り値:

15

問題解決のアイデア:

この問題はビット演算について調べます。問題を解決する 2 つの方法。簡単にまとめた話ですが、いろいろ制約が加わっていてちょっと面白いです。

1) ビット演算の再帰

       再帰を使用して 1 から n までの合計を完了し、n が 0 の場合、&& の右側は実行されず、再帰は終了するという演算特性と組み合わせます。

2) 和の計算式

       Sn=(n+1)*n/2、(n*n+n)>>1に変換、n*nは乗算制限を回避するpow関数で実現、2による除算は右シフトで実現、これにより、分割の制限が回避されます。

テストコード:

1) ビット演算の再帰

class Solution {
public:
    int Sum_Solution(int n) {
        // 与运算判断n是否为正数,若n为0,则与运算后续不执行
        n && (n += Sum_Solution(n - 1));
        return n;
    }
};

2) 和の計算式

class Solution {
public:
    int Sum_Solution(int n) {
        // Sn=(n*n+n)/2
        int result = (int(pow(n, 2)) + n) >> 1;
        return result;
    }
};

おすすめ

転載: blog.csdn.net/zhaitianbao/article/details/132423133