Codeup100000593问题 F: 10进制 VS 2进制

    技术2025-02-14  27

    题目描述:

    对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

    输入:

    一个1000位(即10^999)以内的十进制数。

    输出:

    输入的十进制数的二进制逆序数。

    样例输入:

    985

    样例输出:

    623

    实现代码:

    #include <cstdio> #include <cstdlib> #include <ctime> #include <cstring> #include <algorithm> #include <math.h> using namespace std; char ans2[1000]; struct bign{ int d[1000]; int len; bign(){ memset(d,0,sizeof(d)); len=0; } }; bign change(char str[]){ bign a; a.len=strlen(str); for(int i=0;i<a.len;i++){ if(str[a.len-i-1]>='0'&&str[a.len-i-1]<='9'){ a.d[i]=str[a.len-i-1]-'0'; }else if(str[a.len-i-1]>='A'&&str[a.len-i-1]<='Z'){ a.d[i]=str[a.len-i-1]-'A'+10; } } return a; } bign divide(bign a,int b,int& r,int m){ bign c; c.len=a.len; for(int i=a.len-1;i>=0;i--){ r=r*m+a.d[i]; if(r<b){ c.d[i]=0; }else{ c.d[i]=r/b; r=r%b; } } while(c.len-1>=1&&c.d[c.len-1]==0){ c.len--; } return c; } // 对m进制数依次除以n,等到余数组成数组的倒序进位所求n进制的数 char* m_to_n(bign a,int n,int m){ int i=0; memset(ans2,0,sizeof(ans2)); while(a.len!=1||a.d[0]!=0){ int r=0; a=divide(a,n,r,m); if(r>=0&&r<=9){ ans2[i++]=r+'0'; }else if(r>9){ ans2[i++]=r-10+'a'; } } while(ans2[i-1]==0){ ans2[i-1]='\0'; i--; } return ans2; } int main(){ char x[1000]; while(scanf("%s",&x)!=EOF){ bign a=change(x); char* ans; ans=m_to_n(a,2,10); a=change(ans); ans=m_to_n(a,10,2); int len=strlen(ans); for(int i=len-1;i>=0;i--){ printf("%c",ans[i]); } printf("\n"); memset(ans2,0,sizeof(ans2)); } return 0; }
    Processed: 0.009, SQL: 9