1. 程式人生 > 其它 >分裂的史萊姆(二進位制)

分裂的史萊姆(二進位制)

技術標籤:演算法

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;
}