1522 - 10进制 VS 2进制

对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。

例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

题目输入

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

题目输出

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

输入/输出样例

题目输入

985

题目输出

623

C语言解答

#include<stdio.h>
#include<string.h>
#define max 1000

char ans[max];

void convert(char str[], int m, int n){
	int i, j, k, a[max], b[max], flag;
	for(i=0; i<strlen(str); i++){
		a[i] = str[i]-48;
	}
	k = 0;
	while(1){
		for(i=0; i<strlen(str)-1; i++){
			if(a[i]!=0){
				a[i+1] += (a[i]%n)*m;
				a[i] /= n;
			}
		}
		b[k++] = a[i]%n;
		a[i] /= n;
		flag = 0;
		for(i = 0; i<strlen(str); i++){
			if(a[i]!=0){
				flag = 1;
			}
		}
		if(!flag){
			break;
		}
	}
	for(j=0, i=k-1; i>=0; i--){
		ans[j++] = b[i]+48;
	}
	ans[j] = '\0';
}

int main(){
	int i;
	char str[max];
	while(scanf("%s",str)!=EOF){
		convert(str,10,2);
		memset(str,0,sizeof(str));
		for(i=0; i<strlen(ans); i++){
			str[i] = ans[strlen(ans)-1-i];
		}
		str[i] = '\0';
		memset(ans,0,sizeof(ans));
		convert(str,2,10);
		puts(ans);
	}
	return 0;
}

C++解答

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

char result[5001];

void base_convert(char num[],int s,int e)
{
	int i,flag,k,j,a[5001],b[5001];
	for(i=0;i<strlen(num);i++)
			a[i]=num[i]-48;
	k=0;
	while(1)
	{
		for(i=0;i<strlen(num);i++)
		{
			if(a[i]!=0&&i<strlen(num)-1)
			{
				a[i+1]+=(a[i]%e)*s;
				a[i]/=e;
			}
			if(i==strlen(num)-1)
			{
				b[k++]=a[i]%e;
				a[i]/=e;
			}
		}
		flag=0;
		for(i=0;i<strlen(num);i++)
			if(a[i]!=0)
				flag=1;
		if(!flag)
			break;
	}
	for(j=0,i=k-1;i>=0;i--)
		result[j++]=b[i]+48;
	result[j]='\0';
}

int main()
{
	char s[1001];
	while(scanf("%s",s)!=EOF)
	{
		base_convert(s,10,2);
		reverse(result,result+strlen(result));
		base_convert(result,2,10);
		puts(result);
	}
	return 0;
}
时间限制 1 秒
内存限制 32 MB
讨论 统计
上一题 下一题