HDU 4814 Golden Radio Base

来源:互联网 发布:成都多益网络 编辑:程序博客网 时间:2024/06/03 20:02
#include <iostream>#include <cstdio>#include <string>#include <algorithm>#include <fstream>#include <cstring>using namespace std;struct node {    string in,de;// in(整数部分) de(小数部分) num = in_n in_n-1 in_n-2...in_1 in_0.de_0 de_1 de_2...de_n-1 de_n    node(string a,string b):in(a),de(b){}    node(){}    void print() {        string tmp=in;        reverse(tmp.begin(),tmp.end());        cout<<tmp;        if(de.size())            cout<<"."<<de;        puts("");    }    string add(string ans,string tmp) {        if(ans.size()<tmp.size())            swap(ans,tmp);        int len=tmp.size(),i;        for(i=0;i<len;++i) {            if(tmp[i]=='1')                ++ans[i];        }        return ans;    }    // 加法重载    node operator + (const node &a)  {        node ans(add(in,a.in),add(de,a.de));        ans.form();        return ans;    }    bool check_2() {        bool flag=0;        int len=in.size(),i;        //整数部分        for(i=0;i<len;++i) {            while(in[i]>='2') {                flag=1;in[i]-=2;                if(i<len-1) ++in[i+1];                else    in+='1';                if(i>=2)    ++in[i-2];                else if(i==1)    de=add(de,"1");                else    de=add(de,"01");            }        }        //小数部分        len=de.size();        for(i=0;i<len;++i) {            while(de[i]>='2') {                flag=1;de[i]-=2;                if(i>0) ++de[i-1];                else    in=add(in,"1");                if(i<len-2) ++de[i+2];                else if(i==len-2)   de+="1";                else    de+="01";            }        }        return flag;    }    bool check_11() {        int len=in.size(),i;        bool flag=0;        for(i=len-1;i>0;--i) {            if(in[i]=='1'&in[i-1]=='1') {                flag=1,--in[i],--in[i-1];                if(i==len-1)    in+='1';                else    ++in[i+1];            }        }        if(in[0]=='1'&de[0]=='1') {            --in[0],--de[0];            flag=1;            if(len==1)    in+='1';            else    ++in[i+1];        }        len=de.size();        for(i=0;i<len-1;++i) {            if(de[i]=='1'&de[i+1]=='1') {                flag=1,--de[i],--de[i+1];                if(i==0)    in=add(in,"1");                else    ++de[i-1];            }        }        return flag;    }    //标准化    void form() {        while(check_2());        while(check_11());        int i,len=in.size();        for(i=len-1;i>=0;--i) {            if(in[i]=='0')  in.erase(in.begin()+i,in.begin()+i+1);            else    break;        }        len=de.size();        for(i=len-1;i>=0;--i) {            if(de[i]=='0')  de.erase(de.begin()+i,de.begin()+i+1);            else    break;        }    }}p[33];void pre() {    //预处理,存2^i的数。(0<=i<32)    node t("1","");    int i;    for(i=0;i<32;++i) {        p[i]=t;        t=t+t;    }}int main() {    int N;    pre();    while(~scanf("%d",&N)){        node ans("0","");        int i=0;        //转换成二进制,提高效率。        while(N) {            if(N&1) ans=ans+p[i];            N>>=1,i++;        }        ans.print();    }    return 0;}

0 0
原创粉丝点击