• 进制转换+大数除法


    矩形覆盖

    题目

    我们可以用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<<'
    ';
        }
    }
    
  • 相关阅读:
    分布式系统笔记
    Paxos算法细节详解(一)
    Java G1学习笔记
    Spring Boot 的 10 个核心模块
    k8s 重点
    毕玄:阿里十年,从分布式到云时代的架构演进之路
    netty原理解析
    JVM调优总结(一):基本概念
    《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor
    Oracle 检查表空间使用情况
  • 原文地址:https://www.cnblogs.com/cbw052/p/11755847.html
Copyright © 2020-2023  润新知