-
题目描述:
-
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
-
输入:
-
一个1000位(即10^999)以内的十进制数。
-
输出:
-
输入的十进制数的二进制逆序数。
-
样例输入:
-
173
-
样例输出:
-
181
-
来源:
题目分析:
本题与九度OJ 1080: 进制转换类似。
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
void reverse(int arr[], int left, int right)
{
int i;
for(i = left; i <= (left+right)/2; i++)
swap(arr + i, arr + left + right - i);
}
/*将m进制的大数X所在数组arr_m[]转换为n进制数组arr_n[],并求arr_n[]数组的长度*/
void m_to_n(int arr_m[], int arr_n[], int m, int n, int m_len, int *pn)
{
*pn = 0; //arr_n数组长度清0
int i, j;
for(i = 0; i < m_len;) //不断地将X除以n,并将余数存入arr_n[],直到X为0
{
int r = 0; //余数清0
for(j = i; j < m_len; j++) //将大整数除以n,余数存入r
{
int temp = arr_m[j] + m * r;
r = temp % n;
arr_m[j] = temp / n;
}
arr_n[(*pn)++] = r; //将余数r对应的字符写入n数组
while(arr_m[i] == 0) //略过为0的高位
i++;
}
reverse(arr_n, 0, *pn - 1); //将arr_n[]逆置
}
int main()
{
char s[1010];
int dec[1010] = {0};
int bin[4000] = {0};
while(gets(s) != NULL)
{
int dec_len = strlen(s);
int bin_len = 0;
int *pd = &dec_len;
int *pb = &bin_len;
int i;
for(i = 0; i < dec_len; i++) //将读入的字符串转换为整数数组
dec[i] = s[i] - '0';
m_to_n(dec, bin, 10, 2, dec_len, pb);
reverse(bin, 0, bin_len - 1);
m_to_n(bin, dec, 2, 10, bin_len, pd);
for(i = 0; i < dec_len; i++)
printf("%d", dec[i]);
printf("\n");
}
//system("pause");
return 0;
}
/**************************************************************
Problem: 1208
User: superlc320
Language: C++
Result: Accepted
Time:50 ms
Memory:1020 kb
****************************************************************/