• 进制转换+大数除法


    矩形覆盖

    题目

    我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

    思路

    斐波那契数列

    二进制中1的个数

    题目

    输入一个整数(int),输出该数二进制表示中1的个数。其中负数用补码表示。

    思路

    负数的补码,前导是一连串的1,int为32位

    代码

    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位数字的十进制非负整数转换为二进制数输出。

    思路

    显然这个整数超出了unsigned long long(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<<'
    ';
        }
    }
    
  • 相关阅读:
    代码书写的细节
    php中的正则函数主要有三个-正则匹配,正则替换
    2个比较经典的PHP加密解密函数分享
    淘宝运营中的6大致命误区,你犯过么?
    30分钟教你写出10分的淘宝标题
    超全的web开发工具和资源
    转化率不好?告诉你转化飙秘诀
    帮你店铺日销千单的20个淘宝小技巧
    不刷单,中小卖家如何提升店铺流量?
    使用Flexible实现手淘H5页面的终端适配
  • 原文地址:https://www.cnblogs.com/cbw052/p/11755847.html
Copyright © 2020-2023  润新知