矩形覆盖
题目
我们可以用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<<'\n'; } }