-
题目描述:
-
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
-
输入:
-
一个1000位(即10^999)以内的十进制数。
-
输出:
-
输入的十进制数的二进制逆序数。
-
样例输入:
-
173
-
样例输出:
-
181
思路:
进制转换思路简单,但特别容易出错, 要多练。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
char a[1001];
int t[1000];
int bin[4000];
int lent,lenb;
int i,j,k;
int flag;
int temp;
while( ~scanf( "%s",a ) ) {
lent = strlen(a);
for( i = 0;i < lent;i++ ) {
if( a[i] >= '0' && a[i] <= '9' )
t[i] = a[i] - '0';
else {
printf( "wrong input!");
return 1;
}
}
k = 0;
j = 0;
while( k < lent || t[lent-1] != 0 ) {
flag = 0;
for( i = k;i < lent;i++ ) {
temp = flag;
flag = t[i] % 2; // be careful don't need add flag,but not can't
t[i] = ( t[i] + 10 * temp ) / 2;
}
if( t[k] == 0 )
k++;
if( flag )
bin[j] = 1;
else
bin[j] = 0;
j++;
}
for( i = 0;i < 1000;i++ )
t[i] = 0;
lent = 1;
for( i = 0;i < j;i++ ) {
flag = 0;
for( k = 0;k < lent;k++ ) {
temp = t[k];
t[k] = ( t[k] * 2 + flag ) % 10;
flag = ( temp * 2 + flag ) / 10;
}
if( flag )
t[lent++] = 1;
if( bin[i] )
t[0]++;
}
for( i = lent - 1;i >= 0;i-- )
printf( "%d",t[i] );
printf( "\n" );
}
return 0;
}
/**************************************************************
Problem: 1208
User: liangrx06
Language: C
Result: Accepted
Time:20 ms
Memory:912 kb
****************************************************************/