大数取模,大数进制转换

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

 

173

输出

 

181

 

#include
using namespace std;
/* 
	m为当前进制,n为要转换的进制 
	整个过程类似于10进制到二进制转换的手算过程,取余数-除-取余数-除...... 
*/ 
string trans(int m, string a,int n){
	int len = a.size(),i,j,k,t;
	string b = "";
	for(i = 0; i < len;){
		k = 0;
		for(j = i; j < len; ++j){
			t = (k*m + a[j]-'0')%n; // t是余数 
			a[j] = (k*m + a[j]-'0')/n + '0'; //模拟手算,余数*进制 + 下一位数 作为被除数 
			k = t;  
		}
		b += char(k+'0'); //这里默认转换后逆序 
		while(a[i] == '0') ++i; //去除首位可能的0 
	} 
	return b;
}

int main()
	{
		string a,res;
		while(cin >> a){
			res = trans(10,a,2);
			res = trans(2,res,10); //这里是逆序,需要倒过来 
			reverse(res.begin(),res.end());
			cout << res << endl;
		}
	
	
	 	return 0;
	}

 

/*
	稍微改一下即可实现大数对16进制的转换 
*/
string trans2(int m, string a,int n){
	int len = a.size(),i,j,k,t;
	string b = "";
	for(i = 0; i < len;){
		k = 0;
		for(j = i; j < len; ++j){
			t = (k*m + a[j]-'0')%n; // t是余数 
			a[j] = (k*m + a[j]-'0')/n + '0'; //模拟手算,余数*进制 + 下一位数 作为被除数 
			k = t;  
		}
		b += (k >= 10 ? char(k-10+'A'):char(k+'0')); 
		while(a[i] == '0') ++i; //去除首位可能的0 
	} 
	reverse(b.begin(),b.end());//需要反转才是真正的转换顺序 
	return b;
}

 

你可能感兴趣的:(大数运算)