犯了一个错误,就是加法和乘法最后都需要看有无进位,如果有,则需在前添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;
}