刷題
- 題目描述
- 思路一 (暴力遞歸版)
- 思路二 (妙用內存版)
- 思路三 (快速乘法版)
- 思路四 (構造巧解版)
- Thanks?(・ω・)ノ謝謝閱讀!!!
- 下一篇文章見!!!
題目描述
根據題目描述 ,會有兩個主要難點 : 1 如何控制遍歷,2 如何計算。
因為我們不能使用for while if else switch case
等關鍵字,對于如何實現1 到 n 的遍歷就顯得十分困難。對此想出的策略有類構造函數,遞歸兩種辦法。如何計算注意規避掉公式法就好。
思路一 (暴力遞歸版)
首先我們想到使用遞歸來實現:我們遇到的首要問題就是如何成功遍歷:遞歸不難,但是如何保證遍歷范圍是 1 到 n 呢。這里使用短路處理
在函數中,如果 與運算 成立,則繼續,否則終止函數直接返回false。
class Solution {
public:int Sum_Solution(int n) {//只有 與運算 返回true 才會繼續進行 模擬短路//保證 n 大于 0n && (n+=Sum_Solution(n - 1));return n ;}
};
來看運行效果:
成功運行!!! 過啦!!!
思路二 (妙用內存版)
雖然我們無法使用乘法運算,但是我們可以利用程序內部進行的運算,比如開辟二維空間就可以模擬二階乘法,三維數組可以模擬三階乘法。所以原理非常簡單,開辟一個 n * (n+1) 的二維數組 然后 通過位運算 得到一半即可。
class Solution {
public:int Sum_Solution(int n) {char add[n][n+1];return (sizeof(add) >> 1);}
};
順利運行!!!這種思路我愿稱之為最美
思路三 (快速乘法版)
這道題也可以使用快速乘法來解決。
快速乘法的思路很簡單
- 把其中一個乘數 a 轉換為二進制
- 把每一位都與 另一個乘數 b 相乘 并 乘以 相應階數
- 把每次結果加入 結果 中
我們先用while寫一個通用版本,這道題只需在200以內就可以,即11位
//通用版本
class Solution {
public:int Sum_Solution(int n) {int a = n ;int b = n + 1;int sum = 0;int level = 1;while(b){int i = b & 1;if(i) sum += a * level;b = b >> 1;level *= 2;}return sum / 2;}
};
題目適配版
class Solution {
public:int Sum_Solution(int n) {int a = n ;int b = n + 1;int sum = 0;int level = 1;int i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1;i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1;i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1;i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1;i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1;i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1;i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1;i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1;i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1;i = b & 1;if(i) sum += a * level;b >>= 1;level <<= 1; return sum / 2;}
};
來看效果:
過啦!!!
思路四 (構造巧解版)
我們可以通過構造一個類 ,然后創建一個類數組,就會使用 n 次 構造函數,這里就可以幫助我們解決無法使用關鍵字的問題。
注意使用靜態成員變量,幫助成功完成遍歷求和。
#include <type_traits>
class add{public:add(){i+=j;j++;}static int i,j;};
int add::i = 0;int add:: j = 1;
class Solution {
public:int Sum_Solution(int n) {add sum[n];return add::i;}
};
來看效果:
過啦!!!!!!!!!!!!!