Codeup——593 | 问题 F: 10进制 VS 2进制(大整数的进制转换)

题目描述

对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

输入

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

输出

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

样例输入

985

样例输出

623
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

struct bign{
    
    	\\定义结构体用于存储大整数
	int d[1000];
	int len;
	bign(){
    
    
		memset(d,0,sizeof(d));
		len=0;
	}
};

bign change(string str){
    
    	//将字符串转成整型
	bign a;
	a.len=str.length();
	for(int i=0;i<a.len;i++)
		a.d[i]=str[a.len-i-1]-'0';
	return a;
}

bign divide(bign a,int m,int n,int &r){
    
    	//将a的m进制转成n进制
	bign c;
	c.len=a.len;
	r=0;
	for(int i=a.len-1;i>=0;i--){
    
    
		r=r*m+a.d[i];
		if(r<n) c.d[i]=0;
		else{
    
    
			c.d[i]=r/n;
			r%=n;
		}
	}
	while(c.len-1>=1&&c.d[c.len-1]==0)
		c.len--;
	return c;
}

int main()
{
    
    
	string str,two,result;
	int r,i;
	while(getline(cin,str)){
    
    
	 	bign a=change(str);
		do{
    
    
	 		a=divide(a,10,2,r);
	 		two.push_back(r+'0');
		}while(!(a.d[0]==0&&a.len==1));
		bign b=change(two);	//不需要逆序了,因为此时的two是从0开始存储的,用change函数时已经逆序了。
		do{
    
    
			b=divide(b,2,10,r);
			result.push_back(r+'0');
		}while(!(b.d[0]==0&&b.len==1));
		for(int j=result.length()-1;j>=0;j--)
			cout <<result[j];
		cout <<endl;
		two.clear();
		result.clear();
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44888152/article/details/106968906