著者: 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;
}
};