数学问题 | 十进制与二进制

孤街醉人 提交于 2020-02-29 15:57:04

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

输入: 一个1000位(即10E999)以内的十进制数

输出: 输入的十进制数的二进制逆序数

测试样例:

输入: 173

输出: 181

C++代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<vector> 
using namespace std;

string Divide(string str, int x)	//字符串除法。 字符串 str 除以 x 后,返回所得字符串 
{
	int remainder = 0;		//保留余数 
	for(int i=0; i<str.size(); i++)
	{
		int current = remainder *10 + str[i] - '0';
		str[i] = current / x + '0';
		remainder = current % x;
	}
	int pos = 0;
	while(str[pos] == '0')			//寻找首个非零下标 
	{
		pos++;
	}
	return str.substr(pos);			// !!! 删除前置多余的0 
}

string Multiple(string str, int x)	//!!! 字符串乘法。 字符串数str乘以x,返回所得字符串 
{
	int carry = 0;		//保存进位
	for(int i=str.size() - 1; i>=0; i--)
	{
		int current = x * (str[i] - '0') + carry;
		str[i] = current % 10 + '0';
		carry = current / 10;
	 } 
	 if(carry != 0)	//仍有进位
	 {
	 	str = "1" + str;
	  } 
	  return str;
 } 

string Add(string str, int x)		//!!! 字符串加法。 字符串数str加上x,返回所得字符串  
{
	int carry = x;
	for(int i=str.size() - 1; i>=0; i--)
	{
		int current = (str[i] - '0') + carry;
		str[i] = current%10 + '0';
		carry = current / 10;
	}
	if(carry != 0)	//仍有进位
	{
	 	str = "1" + str;
	 } 
	return str;
 } 


int main()
{
	string str;
	while(cin>>str)
	{
		vector<int> binary;
		while(str.size() != 0)
		{
			int last = str[str.size() - 1] - '0';
			binary.push_back(last % 2);
			str = Divide(str,2);
		}
		string answer = "0";
		int a=0;
		for(int i=0; i<binary.size(); ++i)	//理解:二进制数转化为十进制数,binary[i]内,从第一个非0的数binary[0]开始,乘以2再加下一位数 binary[0],所得的数乘以2再加上下一位数 
		{
			answer = Multiple(answer, 2);	//乘法运算
			answer = Add(answer, binary[i]);//加法运算 
			//a = a * 2 + binary[i];	//注:整形数字可以这么求,现在是字符串数字,需要用上面的 乘法运算 + 加法运算 来循环计算	
		}
		//cout<<a<<endl;
		cout<<answer<<endl; 
	}
	return 0; 
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!