题目描述:
对于一个十进制数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
;
}
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;
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-54989.html