犯了一个错误,就是加法和乘法最后都需要看有无进位,如果有,则需在前添1。 因为没有考虑到加法也需要,我找了好几十分钟,希望以后吸取教训,不再犯同样的错误,大家也注意一下!!! #include <iostream> #include <cmath> using namespace std; //string类除以2 void string_chu_2(string &s) { string t; int a=0;//余后值 for(int i=0; i<s.size(); i++) { //除 char c; c=(a*10+s[i]-'0')/2+'0'; t=t+c; //余 a=(a*10+s[i]-'0')%2; } int i=0; if(t!="0") while(t[i]=='0') i++; t.erase(0,i); s=t; } //string加法 void string_add(string &a,string s) { //对齐 int m=a.size()-s.size(); if(m>0) { for(int i=0; i<m; i++) s='0'+s; } else if(m<0) { for(int i=0; i<-m; i++) a='0'+a; } //相加 bool jin=false; string q;//相加之后的结果 for(int i=a.size()-1; i>=0; i--) { char c; if(jin) { c=(a[i]+s[i]-'0'-'0'+1)%10+'0'; jin=a[i]+s[i]-'0'-'0'+1>=10?true:false; } else { c=(a[i]+s[i]-'0'-'0')%10+'0'; jin=a[i]+s[i]-'0'-'0'>=10?true:false; } q=c+q; } if(jin) q='1'+q; a=q; } //string乘2 string string_mul_2(string s) { string q; bool jin=false; for(int i=s.size()-1; i>=0; i--) { char c=((s[i]-'0')*2)%10+jin+'0'; q=c+q; if(s[i]>='5') jin=true; else jin=false; } if(jin) q='1'+q; return q; } int main() { string a1;//输入的十进制数 while(cin>>a1) { if(a1=="0") { cout<<0<<endl; continue; } string s1;//输入数的二进制表示 //转为二进制 while(a1!="0") { char c; if((a1[a1.size()-1]-'0')%2==0) c='0'; else c='1'; s1=c+s1; string_chu_2(a1); } //cout<<"s1:"<<s1<<endl; //将二进制数逆序过来 string s2;//s1的逆序 int k=s1.size()-1; while(s1[k]=='0') k--; for(; k>=0; k--) s2=s2+s1[k]; //cout<<endl<<"s2:"<<s2<<endl; //二进制转十进制 //int j=0; string a2="0"; string q="1"; for(int i=s2.size()-1; i>=0; i--) { //cout<<q; //cout<<" q:"<<q<<endl; if(s2[i]=='1') string_add(a2,q); //cout<<"a2:"<<a2<<endl; q=string_mul_2(q); } //cout<<a2<<endl; cout<<a2<<endl; } return 0; }