基本変換整数除算+

長方形のフットプリント

タイトル

我々は、2使用できる横の小さな四角形1または垂直より大きな長方形を覆います。N 2の使用する重複のない小さな四角形1カバレッジ大きな長方形2 * nを、どのように多くの方法の合計は?

考え

フィボナッチ数

2進数の1の数

タイトル

整数(INT)を入力し、2進数の数1を表す出力します。前記負の数は補数を示します。

考え

負の補数は、プリアンブルは1のシリーズで、32ビットのint型

コード

class Solution {
public:
     int  NumberOf1(int n) {
         int cnt=0;
         if(n==0)
             cnt=0;
         else if(n>0){
             while(n>0){
                 if(n&1==1){
                     cnt++;
                 }
                 n /= 2;
             }
         }else{
             int div=0;
             while(n<0){
                 if(n&1==1){
                     cnt++;
                 }
                 n /= 2;
                 div++;
             }
             cnt += (32-div);
         }
         return cnt;
     }
};

進変換

タイトル

最大30桁非負整数出力の長さは、2進数に変換されます。

考え

明らかに、この整数は、符号なし長い長い(20桁)を超える範囲が必要表す手書き整数除算を

コード

#include<iostream>
#include<stack>
#include<cstring>
#include<string>

using namespace std;

int num[30];
int tmp[30];
stack<int> bin;
string str;

bool equalZero(int num[]){
    bool flag=true;
    for(int i=0;i<=29;i++){
        if(num[i]!=0){
            flag=false;
            break;
        }
    }
    return flag;
}

int main(){
    while(cin>>str){
        //string存入int数组
        memset(num,0,sizeof(num));
        memset(tmp,0,sizeof(tmp));
        int len=str.size();
        int cnt=29;
        len--;
        while(len>=0){
            num[cnt--]=(str[len--]-'0');
        }
        //当num!=0时执行大数除法
        while(equalZero(num)==false){
            bin.push(num[29]%2);
            //大数除法
            int carry=0;
            for(int i=0;i<=29;i++){
                tmp[i]=(carry+num[i])/2;
                carry=(carry+num[i])%2;
                carry*=10;
            }
            memcpy(num,tmp,sizeof(tmp));
            memset(tmp,0,sizeof(tmp));
        }
        while(!bin.empty()){
            cout<<bin.top();
            bin.pop();
        }
        cout<<'\n';
    }
}

おすすめ

転載: www.cnblogs.com/cbw052/p/11755847.html