#include<stdio.h>
#include<string.h>
struct bigInteger {
int digit[1000];
int size;
bigInteger operator+(const bigInteger &A) const {
bigInteger res;
res.init();
int carry = 0;
int tmp = 0;
for (int i = 0; i < A.size || i < size; i++) {
tmp = digit[i] + A.digit[i] + carry;
carry = tmp / 10000;
res.digit[res.size++] = tmp % 10000;
}
if (carry != 0)
res.digit[res.size++] = carry;
return res;
}
bigInteger operator*(const int &A) const {
bigInteger res;
res.init();
int carry = 0;
int tmp = 0;
for (int i = 0; i < size; i++) {
tmp = digit[i] * A + carry;
carry = tmp / 10000;
res.digit[res.size++] = tmp % 10000;
}
if (carry != 0)
res.digit[res.size++] = carry;
return res;
}
bigInteger operator/(int A) const {
bigInteger res;
res.size = 0;
res.init();
int left = 0;
for (int i = size - 1; i >= 0; i--) {
if (((left * 10000 + digit[i]) / A) == 0) {
left = left * 10000 + digit[i];
res.digit[i] = 0;
} else {
res.digit[i] = (left * 10000 + digit[i]) / A;
left = (left * 10000 + digit[i]) % A;
}
}
for (int i = size - 1; i >= 0; i--) {
if (res.digit[i] != 0) {
res.size = i;
break;
}
}
res.size++;
return res;
}
int operator%(int A) const {
int res;
int left = 0;
for (int i = size - 1; i >= 0; i--) {
if ((left * 10000 + digit[i]) / A == 0) {
left = left * 10000 + digit[i];
} else {
left = (left * 10000 + digit[i]) % A;
}
}
return left;
}
void init() {
for (int i = 0; i < 1000; i++)
digit[i] = 0;
size = 0;
}
void set(char str[]) {
init();
int len = strlen(str);
int cnt = 0;
int res = 0;
int weight = 1;
for (int i = len - 1; i >= 0; i--) {
res += weight * (str[i] - '0');
cnt++;
weight *= 10;
if (cnt == 4 || i == 0) {
digit[size++] = res;
cnt = 0;
res = 0;
weight = 1;
}
}
}
void set(int a) {
init();
int tmp = 0;
do {
tmp = a % 10000;
digit[size++] = tmp;
a /= 10000;
} while (a != 0);
}
void output() {
for (int i = size - 1; i >= 0; i--) {
if (i == size - 1)
printf("%d", digit[i]);
else
printf("%04d", digit[i]);
}
}
};
char str[1000];
//char ans[1000];
int midRes[1000];
int main() {
while (scanf("%s", str) != EOF) {
bigInteger num, ans, mul;
num.set(str);
int size = 0;
int remainder = 0;
do {
remainder = num % 2;
midRes[size++] = remainder;
num = num / 2;
} while (num.size != 1 || num.digit[0] != 0);
ans.set(0);
mul.set(1);
for (int i = size - 1; i >= 0; i--) {
if (midRes[i] == 1)
ans = ans + mul;
mul = mul * 2;
}
ans.output();
printf("\n");
}
return 0;
}
题目链接:
http://ac.jobdu.com/problem.php?pid=1208