1522 - 10进制 VS 2进制

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

对于一个十进制数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;
}

Java解答

import java.util.*;
import java.math.BigDecimal;
public class Main {
	public static void main(String[] args){
		Scanner cin=new Scanner(System.in);
		String  s;
		while(cin.hasNext()){
			s=cin.nextLine();	
			System.out.println(shi(er(s)));
		}
	}
	public static String shi(String str){
		int len=str.length()-1;
		BigDecimal a=new BigDecimal(1),e=new BigDecimal(2),f=new BigDecimal(0);
		for(int i=len;i>=0;i--)	{
			if(str.charAt(i)=='1')
				{
					f=f.add(a);
				}		
				a=a.multiply(e);
			}
		return f+"";
	}
	public static String er(String str){
		BigDecimal a=new BigDecimal(str),b=new BigDecimal(1),c=new BigDecimal(2),d=new BigDecimal(0);
		int i=0;
		String s="";
		while(a.compareTo(d)!=0){		
			if((a.remainder(c)).compareTo(b)==0)
				s+=1+"";
			else  
				s+=0+"";
			a=a.divide(c,0,BigDecimal.ROUND_HALF_DOWN);
		}
		return s;
	}
}