标签:cnt include 进制 大数 int len while num 除法
矩形覆盖
题目
我们可以用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';
}
}
标签:cnt,include,进制,大数,int,len,while,num,除法 来源: https://www.cnblogs.com/cbw052/p/11755847.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。