概述
题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入描述:
一个1000位(即10^999)以内的十进制数。
输出描述:
输入的十进制数的二进制逆序数。
示例1
输入
173
输出
181
思路
输入长达999位,所以要用字符串或者整型数组接收。这题主要难点就要写整型数组的除法,乘法与加法。
代码
#include<iostream>
#include<cstring>
#include<string>
#include<stack>
using namespace std;
int flag;
int ten1[1001], ten2[1002], two[4000], len, len3;
void chufa()
{
int j = 0, y = 0, t, k=0, x;
int num[1002];
int flag2 = 0;
memset(num, 0, sizeof(num));
while (j < len)
{
t = y * 10 + ten1[j];
x = t / 2;
if (x == 0 && flag2 == 0)
{
y = t;
j++;
continue;
}
num[k++] = x;
flag2 = 1;
y = t - 2 * x;
j++;
}
len = k;
if (flag2 == 0) flag = 0;
memset(ten1, 0, sizeof(ten1));
for (j = 0;j < len;j++) ten1[j] = num[j];
/* cout << num[j];
cout << endl;*/
}
void chengfa()
{
int y, r = 0, k=0, j, g;
stack<int> s;
for (j = len3 - 1;j >= 0;j--)
{
y = ten2[j] * 2 + r;
g = y % 10;
r = y / 10;
s.push(g);
}
if (r != 0) s.push(r);
memset(ten2, 0, sizeof(ten2));
while (!s.empty())
{
ten2[k++] = s.top();
s.pop();
}
len3 = k;
}
int jiafa(int i)
{
if (two[i] == 0)
{
return 0;
}
int y, j, r, m, f=0;
stack<int> s;
r = two[i];
for (j = len3-1;j >= 0;j--)
{
y = r + ten2[j];
m = y % 10;
s.push(m);
r = y / 10;
}
if (r != 0) s.push(r);
memset(ten2, 0, sizeof(ten2));
while (!s.empty())
{
ten2[f++] = s.top();
s.pop();
}
len3 = f;
}
int main()
{
string tmp;
int i, o, k, len1;
cin >> tmp;
flag = 1;
k = 0;
for (i = 0;i < tmp.size();i++)
{
ten1[i] = tmp[i]-'0';
}
len = i;
while (flag)
{
o = ten1[len - 1] % 2;
two[k++] = o;
chufa();
}
len1 = k;
/*len1 = 2;
two[1] = 1;*/
/*for (i = len1-1;i >= 0;i--)
{
cout << two[i];
}
cout << endl;*/
memset(ten2, 0, sizeof(ten2));
len3 = 0;
jiafa(0);
for (i = 1;i < len1;i++)
{
chengfa();
jiafa(i);
}
for (i = 0;i < len3;i++)
{
cout << ten2[i];
}
cout << endl;
return 0;
}
最后
以上就是典雅乐曲为你收集整理的【牛客刷题】 10进制 vs 2进制的全部内容,希望文章能够帮你解决【牛客刷题】 10进制 vs 2进制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复