題目一:給出兩個整數a和b, 求他們的和, 但不能使用+
等數**算符。
**:int aplusb(int a, int b)
else}
看到題目第一反應就是一臉茫然,計算加法不能用加號?emmmm首選度娘,然後我見到了位運算。
嗯,從來沒學過的位運算。
這道題目主要用的是與運算&、異或運算^,左移一位<<1
以簡單為例:0011+1001
無進製的運算是1010,通過^運算實現
進製是0001,通過&運算實現
加法是本位相加再加上低位的進製,所以運算是1010+0010
0010由0001左移一位實現
當進製為0時,運算結束
我理解的思路大致如此。
emmmm中途也有點小失誤的說,因為我不小心把左移打成右移,使得通過率只有44%,還以為做100+(-100)時還要把(-100)求補碼(實際上就是100)再運算,當成減法了,很尷尬。
題目二:設計乙個演算法,計算出n階乘中尾部零的個數
**:long long trailingzeros(long long n)
return num;
}講真,這個題目我做的內牛滿面。首先我考慮的是計算階乘的結果,然後用這個結果不斷除以10,計算0的個數,然後很榮幸的卡在了165這個數字上,結果太大了,找度娘,學了高精度計算階乘,然後又卡在了1001171717上,後來我想每除一次10就把資料分別向前移一位,但是並沒有什麼用,光是末尾0的個數就有250292920個,現在很明顯思路是完全錯了
錯**如下:
long long trailingzeros(long long n)
for(q = 0;f[q] == 0;q++)//記錄每一次乘法以後末尾0的個數
for(q = sum1;q<2000;q++)
}//得到的f陣列就是階乘的結果(由低位向高位排列)
return sum;
} 後來看到有大佬們用分解因子分解資料,沒完全看懂。我的思路是計算每個資料的2的因子的個數,然後把2按個數寫入陣列,再計算
5的個數,按個數把5寫入陣列,當前兩個資料相乘為10,前兩個元素從陣列中刪除,計數器加一,嗯,同樣的問題,1001171717資料太大,陣列越界。
錯**如下:
long long trailingzeros(long long n)
else if(temp%5 == 0)//i被5整除
else
if(stack[top]*stack[top-1]==10)//棧頂以及其後乙個元素相乘為10
if(top >= 20000000-1)
return num;
}emmmm,雖然思路錯了兩次但是還是有些收穫的,學會了高精度計算階乘演算法,還有之前的位運算,打算有時間整理一下。同時我發現我的思維過於僵化,還是有點死腦筋,如果早一些想到正確的思路就不用浪費好幾個小時琢磨了,哭哭。
階乘尾部的0
挑戰 首先我們不考慮時間複雜的解決思路是先求出 n 的階乘,然後再計算 n 階乘尾部 0 的個數。如下 public long trailingzeros long n 求尾部 0 的個數 while arg 10 0 result arg 10 return result 時間複雜度為 o n 那...
階乘尾部0的個數
輸入 輸入資料有若干行,每行上有乙個非負整數n,對應一種情形。輸出 對於每一種情形,直接輸出結果 換行。樣例輸入816 30樣例輸出13 7方法一 令f x 表示正整數x末尾所含有的 0 的個數,則有 當0 n 5時,f n 0 當n 5時,f n k f k 其中 k n 5。include in...
python 刪除尾部0 初學python的小心得
之前曾在datacamp系統地學習過r,學習python的時候多少有些熟悉感,不過兩種不同的語言還是有挺多不同,接下來記錄一下新學的知識和踩過的雷 python大小寫敏感,需注意命令的縮排 集合 不包含重複元素,會自動刪除重複值 集合操作 update 更新,xx.discard 刪除,in 查詢,...