高精度整数 6
2016-02-04 20:51
387 查看
/*
题目1208:10进制 VS 2进制
题目描述:
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入:
一个1000位(即10^999)以内的十进制数。
输出:
输入的十进制数的二进制逆序数。
样例输入:
173
样例输出:
181
*/
#include<stdio.h>
#include<string.h>
#define maxn 1010
#define MIN(a,b) a >= b ? b : a
#define MAX(a,b) a >= b ? a : b
struct bigInt {
int digit[260]; //maxn/4
int size;
void init() {
memset(digit,0,sizeof(digit));
size = 0;
}
void set(char str[]) {
init();
int len = strlen(str);
int i,j,c = 1,sum = 0;
for(i = len-1,j = 0; i >= 0; i--) {
sum += (str[i] - '0') * c;
c *= 10;
j++;
if(j==4 || i == 0) {
digit[size++] = sum;
c = 1;
j = 0;
sum = 0;
}
}
}
void set(int x) {
init();
int j = 0,sum = 0,c = 1;
size = 0;
do {
sum += (x % 10)*c;
x /= 10;
c *= 10;
j++;
if(j==4) {
digit[size++] = sum;
sum = 0;
c = 1;
j = 0;
}
}while(x);
if(sum || size == 0) digit[size++] = sum;
}
bigInt operator + (const bigInt& b) {
bigInt ret;
ret.init();
int i;
int maxLen = MAX(size,b.size);
int sum,carry = 0;
for(i = 0; i < maxLen; i++ ) {
sum = digit[i] + b.digit[i] + carry;
carry = sum / 10000;
sum %= 10000;
ret.digit[ret.size++] = sum;
}
if(carry) ret.digit[ret.size++] = carry;
return ret;
}
bigInt operator + (int x) {
bigInt ret;
ret.init();
ret.digit[0] += x;
int carry = ret.digit[0] / 10000;
ret.digit[0] %= 10000;
int i = 1;
while(carry) {
ret.digit[i] += carry;
carry = ret.digit[i] / 10000;
ret.digit[i] %= 10000;
i++;
}
return ret;
}
bigInt operator * (int x) {
bigInt ret;
ret.init();
int i;
int sum,carry = 0;
for(i = 0; i < size; i++ ) {
sum = digit[i] * x + carry;
carry = sum / 10000;
sum %= 10000;
ret.digit[ret.size++] = sum;
}
if(carry) ret.digit[ret.size++] = carry;
return ret;
}
bigInt operator / (int x) {
bigInt ret;
ret.init();
int i;
int remainder = 0;
int t,r;
for(i = size-1; i >= 0; i-- ) {
t = (remainder * 10000 + digit[i]) / x;
ret.digit[i] = t;
r = (remainder * 10000 + digit[i]) % x;
remainder = r;
}
for(i = size - 1; i >= 0; i--)
if(ret.digit[i]) {
ret.size = i;
break;
}
ret.size++;
return ret;
}
int operator % (int x) {
int i;
int remainder = 0;
int t,r;
for(i = size-1; i >= 0; i-- ) {
t = (remainder * 10000 + digit[i]) / x;
r = (remainder * 10000 + digit[i]) % x;
remainder = r;
}
return remainder;
}
void output() {
int i;
for(i = size - 1; i >= 0; i--)
if(i == size - 1) printf("%d",digit[i]);
else printf("%04d",digit[i]);
printf("\n");
}
};
char str[maxn];
int ans[10000];
int main()
{
int n;
int i;
int size;
bigInt a,sum,c,t;
while(scanf("%s",str) != EOF) {
a.set(str);
size = 0;
do {
ans[size++] = a % 2;
a = a / 2;
}while( !(a.digit[0] == 0 && a.size == 1) );
sum.init();
for(i = 0; i < size; i++) {
t.set(ans[i]);
sum = sum * 2 + t;
}
sum.output();
}
return 0;
}
题目1208:10进制 VS 2进制
题目描述:
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入:
一个1000位(即10^999)以内的十进制数。
输出:
输入的十进制数的二进制逆序数。
样例输入:
173
样例输出:
181
*/
#include<stdio.h>
#include<string.h>
#define maxn 1010
#define MIN(a,b) a >= b ? b : a
#define MAX(a,b) a >= b ? a : b
struct bigInt {
int digit[260]; //maxn/4
int size;
void init() {
memset(digit,0,sizeof(digit));
size = 0;
}
void set(char str[]) {
init();
int len = strlen(str);
int i,j,c = 1,sum = 0;
for(i = len-1,j = 0; i >= 0; i--) {
sum += (str[i] - '0') * c;
c *= 10;
j++;
if(j==4 || i == 0) {
digit[size++] = sum;
c = 1;
j = 0;
sum = 0;
}
}
}
void set(int x) {
init();
int j = 0,sum = 0,c = 1;
size = 0;
do {
sum += (x % 10)*c;
x /= 10;
c *= 10;
j++;
if(j==4) {
digit[size++] = sum;
sum = 0;
c = 1;
j = 0;
}
}while(x);
if(sum || size == 0) digit[size++] = sum;
}
bigInt operator + (const bigInt& b) {
bigInt ret;
ret.init();
int i;
int maxLen = MAX(size,b.size);
int sum,carry = 0;
for(i = 0; i < maxLen; i++ ) {
sum = digit[i] + b.digit[i] + carry;
carry = sum / 10000;
sum %= 10000;
ret.digit[ret.size++] = sum;
}
if(carry) ret.digit[ret.size++] = carry;
return ret;
}
bigInt operator + (int x) {
bigInt ret;
ret.init();
ret.digit[0] += x;
int carry = ret.digit[0] / 10000;
ret.digit[0] %= 10000;
int i = 1;
while(carry) {
ret.digit[i] += carry;
carry = ret.digit[i] / 10000;
ret.digit[i] %= 10000;
i++;
}
return ret;
}
bigInt operator * (int x) {
bigInt ret;
ret.init();
int i;
int sum,carry = 0;
for(i = 0; i < size; i++ ) {
sum = digit[i] * x + carry;
carry = sum / 10000;
sum %= 10000;
ret.digit[ret.size++] = sum;
}
if(carry) ret.digit[ret.size++] = carry;
return ret;
}
bigInt operator / (int x) {
bigInt ret;
ret.init();
int i;
int remainder = 0;
int t,r;
for(i = size-1; i >= 0; i-- ) {
t = (remainder * 10000 + digit[i]) / x;
ret.digit[i] = t;
r = (remainder * 10000 + digit[i]) % x;
remainder = r;
}
for(i = size - 1; i >= 0; i--)
if(ret.digit[i]) {
ret.size = i;
break;
}
ret.size++;
return ret;
}
int operator % (int x) {
int i;
int remainder = 0;
int t,r;
for(i = size-1; i >= 0; i-- ) {
t = (remainder * 10000 + digit[i]) / x;
r = (remainder * 10000 + digit[i]) % x;
remainder = r;
}
return remainder;
}
void output() {
int i;
for(i = size - 1; i >= 0; i--)
if(i == size - 1) printf("%d",digit[i]);
else printf("%04d",digit[i]);
printf("\n");
}
};
char str[maxn];
int ans[10000];
int main()
{
int n;
int i;
int size;
bigInt a,sum,c,t;
while(scanf("%s",str) != EOF) {
a.set(str);
size = 0;
do {
ans[size++] = a % 2;
a = a / 2;
}while( !(a.digit[0] == 0 && a.size == 1) );
sum.init();
for(i = 0; i < size; i++) {
t.set(ans[i]);
sum = sum * 2 + t;
}
sum.output();
}
return 0;
}
相关文章推荐
- PySide里如何加载图片资源
- jQuery实现简单选项卡
- iOS-NSNotificationCenter的应用
- hdoj5570balls【求期望】
- 闲聊:项目延期,怎么回事?
- bzoj2671 Calc 数论
- BZOJ1003: [ZJOI2006] 物流运输 trans
- 【bzoj3224】普通平衡树
- Gallery的使用
- hibernate 查询外键的值
- neuq oj 1007 计负均正 C++
- windows,Linux,Mac OS x 烧写beaglebone black的方法
- 机房重构日期时间函数
- 实现更简单的异步操作
- poj 1287 Networking
- python中yield语句详解——译自stack overflow
- 高精度整数 5
- Android学习路线(二十四)ActionBar Fragment运用最佳实践
- Quartz-Cron Expression 使用介绍
- MediaRecorder可以实现录音和录像