十進制轉換成二進制

問題 B: Hz的進制

時間限制: 1 Sec  內存限制: 128 MB
提交: 20  解決: 14
[提交][狀態][討論版]

題目描述

Hz遇到一個數學問題,想請教聰明的你:給定一個有符號整數類型的數,Hz想知道該數

二進制表示中1的個數。其中負數用補碼錶示。

輸入

測試樣例輸入包含一個有符號整數類型的整數n,注意可以是負數

輸出

該數二進制表示中1的個數。其中負數用補碼錶示。

樣例輸入

1
-5

樣例輸出

1
31

提示

int佔用4字節,32比特(即32位),數據範圍爲-2147483648~2147483647[-2^31~2^31-1] 


負整數的補碼求法:將其對應正數二進制表示所有位取反(包括符號位,0變1,1變0)後加1 



如 -5 其二進制補碼1的個數爲31 



-5對應正數5(00000000000000000000000000000101) 



→所有位取反(11111111111111111111111111111010) 



→加1    (11111111111111111111111111111011) 


#include<stdio.h>
int main()
{
    int n,i,j,s,a[35];
    while(~scanf("%d",&n))
    {
        s=0;
        if(n>=0)
        {
            while(n)
            {
                if(n%2==1)
                {
                    s++;
                 } 
                n/=2;
            }
        }
        else
        {
            i=0;
            n=-n;
            while(n)
            {
                a[i]=n%2;
                n/=2;
                i++;
            }//將得到的每一個餘數存到a[i]裏
            s=32-i;
            for(j=0;j<i;j++)
            {
                if(a[j]==1)
                    a[j]=0;
                else
                    a[j]=1;
            }取反
            a[0]=a[0]+1;//取反後加一
            for(j=0;j<i;j++)
            {
                a[j+1]=a[j+1]+a[j]/2;
                a[j]=a[j]%2;
            }進位
            for(j=0;j<i;j++)
            {
                if(a[j]==1)
                    s++;
            }
        }
        printf("%d\n",s);
    }
    return 0;
}


發佈了67 篇原創文章 · 獲贊 12 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章