九度OJ题目1208-10进制 VS 2进制

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

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

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

样例输入:
173
样例输出:
181

参考代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define M 300
#define N 10001
struct bigInt {
	int digit[M];
	int size;
	void init() {
		memset(digit, 0, sizeof digit);
		size = 0;
	}
	void output() {
		for (int i = size - 1; i >= 0; i--) {
			if (i != size - 1) {
				printf("%04d", digit[i]);
			}
			else {
				printf("%d", digit[i]);
			}
		}
		printf("\n");
}
	void set(char str[]) {//将字符串转化为高精度整数,4位为一组
		init();
		int len = strlen(str);
		for (int i = len - 1, j = 0, t = 0, c = 1; i >= 0; i--) {
			t += (str[i] - '0')*c;
			c *= 10;
			j++;
			if (j == 4 || i == 0) {
				digit[size++] = t;
				c = 1; t = 0;
				j = 0;
			}
		}
	}
	void set2(int x) {//将小正数转化为高精度整数,4位为一组
		init();
		do {
			digit[size++] = x % 10000;
			x /= 10000;
		} while (x);
	}
	bigInt operator +(const bigInt &A)const {
				bigInt ret;
				ret.init();
				int carry = 0;
				for (int i = 0; i < size||i<A.size; i++) {
					int tmp = A.digit[i] + digit[i]+carry;
					carry = tmp / 10000;
					tmp %= 10000;
					ret.digit[ret.size++] = tmp;
				}
				if (carry != 0) {
					ret.digit[ret.size++] = carry;
				}
				return ret;
			}
			bigInt operator *(int x) const {
				bigInt ret;
				ret.init();
				int carry = 0;
				for (int i = 0; i < size; i++) {
					int tmp=x*digit[i]+carry;
					carry=tmp/10000;
					tmp %= 10000;
					ret.digit[ret.size++] = tmp;
				}
				if (carry != 0) {
					ret.digit[ret.size++] = carry;
				}
				return ret;
			}
	bigInt operator /(int x)const {//高精度整数与普通整数相除
		bigInt ret;
		ret.init();
		int rem = 0;
		for (int i = size - 1; i >= 0; i--) {
			int t = (rem * 10000 + digit[i]) / x;
			int r = (rem * 10000 + digit[i]) % x;
			ret.digit[i] = t;
			rem = r;
		}
		ret.size = 0;//若结果为0
		for (int i = 0; i < M; i++) {
			if (digit[i] != 0)
				ret.size = i;
		}
		ret.size++;
		return ret;
	}
	int operator %(int x)const {//高精度整数与普通整数取余运算
		bigInt ret;
		ret.init();
		int rem = 0;
		for (int i = size - 1; i >= 0; i--) {
			int t = (rem * 10000 + digit[i]) / x;
			int r = (rem * 10000 + digit[i]) % x;
			ret.digit[i] = t;
			rem = r;
		}
		return rem;
	}

};
char str[N];
int buf[N];
int main() {
	while (scanf("%s", str) != EOF) {
		int cnt = 0;
		int len = strlen(str);
		bigInt a, b, c;
		b.set2(0);
		c.set2(1);
		a.set(str);
		do {//转换为2进制
			int t = a % 2;
			a = a / 2;
			buf[cnt++] = t;
		} while (a.digit[0] != 0 || a.size != 1);
		for (int i = cnt - 1; i >= 0; i--) {//转换为10进制
			b = b + c*buf[i];
			c = c * 2;
		}
		b.output();
	}
	return 0;
}
发布了53 篇原创文章 · 获赞 3 · 访问量 3516

猜你喜欢

转载自blog.csdn.net/sinat_38292108/article/details/88319559