分裂的史萊姆(二進位制)
阿新 • • 發佈:2021-02-14
技術標籤:演算法
Description
史萊姆(Slime),是一種在現代電子遊戲與奇幻小說常常出現的虛構生物,最早在1958年同名小說裡出現。其流行形象是一種果凍狀或半液體狀、身體不透明或半透明、可以變換形狀、能夠分裂或融合的怪物。
分裂史萊姆是一種可以分裂的史萊姆,每天夜晚,一個健康的史萊姆都可以分裂成兩個健康的史萊姆。
小Q重生成為了一個史萊姆,他想組建自己的史萊姆帝國,如果小Q想要擁有由n(1 ≤n≤ 10^9)n(1 ≤n≤ 10
9
)個人組成的軍隊,還需要號召多少史萊姆加入他。
Input Description
輸入一個數n(1 ≤n≤ 10^9)n(1 ≤n≤ 10^9 ),n是小Q想要組成軍隊的人數。
Output Description
輸出一個整數mm,表示還需要m個史萊姆加入小Q,他才能實現這個目標。
Hint
看第二個樣例,通過小Q小Q分裂,1\ ->2\ ->4\ ->8,就可以得到88個史萊姆,所以不需要號召其他的史萊姆,所以答案是00。
題解
這是一道二進位制題。舉個例子:8的二進位制碼是1000,所以他能由一個史萊姆產生;5的二進位制碼是101,有兩個“1,因為一個史萊姆只能產生一個“1”(2的n次冪),所以需要兩個史萊姆。找到規律後就可以寫程式碼了!
第二種解法,把它當作一道數學題。如果一個數反覆/2能夠除到盡頭(除到1),就說明它是2的n次冪,如果除到某個數得到的是奇數就加1,說明當前位置如果不再號召一個史萊姆就無法達成目標,然後也可以寫程式碼啦(也不會超時)。
參考程式碼
二進位制寫法:
#include <iostream>
using namespace std;
int main()
{
int n,ans=0;
cin >> n;
while (n)
{
if (n & 1)//n為奇數時,對應的二進位制數最低位一定是1,n&1的結果就是1.n為偶數時,相應的最低位為0,n&1的結果就是0.
ans++;
n >>= 1;
}
cout << ans-1 << endl; //減去它本身
return 0;
}
數學演算法:
#include <iostream>
using namespace std;
int main()
{
int n,ans=0;
cin >> n;
while (n)
{
if (n %2==1)
ans++;
n =n/2;
}
cout << ans-1 << endl;//減去它本身
return 0;
}