涉及字符串2进制和十进制的互相转化 定义字符串加,乘,除函数。算法有点复杂。
10进制 VS 2进制
http://www.nowcoder.com/questionTerminal/fd972d5d5cf04dd4bb4e5f027d4fc11e
//题目说的是1000位的数 不是1000以内的数 只能用字符串的形式计算而不能用int long等整型; #include<cstdio> #include<iostream> #include<vector> #include<string> using namespace std; string str; vector<int>v; void divide(){//字符串除法; int remain=0; for(int i=0;i<str.size();++i){ int temp=remain*10+str[i]-'0'; remain=temp%2; str[i]=temp/2+'0'; } while(str[0]=='0') str.erase(0,1); } string multiple(string answer,int x){//字符串answer乘以x int CF=0; for(int i=answer.size()-1;i>=0;i--){ char temp=answer[i]; answer[i]=((answer[i]-'0')*x+CF)%10+'0'; CF=((temp-'0')*x+CF)/10; } if(CF!=0)//检查最高位是否有进位 answer.insert(0,"1"); return answer; } string add(string answer,int x){//字符串加法 int CF=x; for(int i=answer.size()-1;i>=0;i--){ int temp=answer[i]-'0'+CF; answer[i]=temp%10+'0'; CF=temp/10; } if(CF!=0)//检查最高位是否有进位 answer.insert(0,"1"); return answer; } int main(){ cin>>str; while(!str.empty()){//十进制化为2进制装入容器v中 v.push_back((str.back()-'0')%2); divide(); } while(v[0]==0)//得到逆序的2进制 去掉最前面的0 v.erase(v.begin(),v.begin()+1); string answer="0"; for(int i=0;i<v.size();++i){//二进制化为10进制 answer=multiple(answer,2); answer=add(answer,v[i]); } cout<<answer<<endl; return 0; }