您的位置:首页 > 其它

uva 763 - Fibinary Numbers(斐波那契数)

2013-11-02 16:17 204 查看
题目链接:uva 763 - Fibinary Numbers

题目大意:给出两个二进制数,表示两个斐波那契数进制数,将两个数值相加,以斐波那契二进制的形式输出。斐波那契数列 1、2、3、5、8......,那对应的二进制1010就是 1 * 5 + 3 * 0 + 2 * 1 + 1 * 0 = 7,注意,输出的斐波那契二进制中不能有连续的两个1。

解题思路:先计算出100个斐波那契数的值,作为进制的转换的基数,注意斐波那契数要用大数计算。

如果WA了可以试一下 0 0 ,answer: 0.

#include <stdio.h>
#include <string.h>
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
const int N = 105;
const int MAXBIGN = 305;

struct bign {
int s[MAXBIGN];
int len;
bign() {
len = 1;
memset(s, 0, sizeof(s));
}

bign operator = (const char *number) {
len = strlen(number);
for (int i = 0; i < len; i++)
s[len - i - 1] = number[i] - '0';
return *this;
}
bign operator = (const int num) {
char number
;
sprintf(number, "%d", num);
*this = number;
return *this;
}

bign (int number) {*this = number;}
bign (const char* number) {*this = number;}

bign operator + (const bign &c){
bign sum;
int t = 0;
sum.len = max(this->len, c.len);
for (int i = 0; i < sum.len; i++) {
if (i < this->len) t += this->s[i];
if (i < c.len) t += c.s[i];
sum.s[i] = t % 10;
t /= 10;
}

while (t) {
sum.s[sum.len++] = t % 10;
t /= 10;
}

return sum;
}

bign operator - (const bign &c) {
bign ans;
ans.len = max(this->len, c.len);
int i;

for (i = 0; i < c.len; i++) {
if (this->s[i] < c.s[i]) {
this->s[i] += 10;
this->s[i + 1]--;
}
ans.s[i] = this->s[i] - c.s[i];
}

for (; i < this->len; i++) {
if (this->s[i] < 0) {
this->s[i] += 10;
this->s[i + 1]--;
}
ans.s[i] = this->s[i];
}
while (ans.s[ans.len - 1] == 0) {
ans.len--;
}
if (ans.len == 0) ans.len = 1;
return ans;
}

void put() {
if (len == 1 && s[0] == 0) {
printf("0");
} else {
for (int i = len - 1; i >= 0; i--)
printf("%d", s[i]);
}
}

bool operator < (const bign& b) const {
if (len != b.len)
return len < b.len;

for (int i = len - 1; i >= 0; i--)
if (s[i] != b.s[i])
return s[i] < b.s[i];
return false;
}
bool operator > (const bign& b) const { return b < *this; }
bool operator <= (const bign& b) const { return !(b < *this); }
bool operator >= (const bign& b) const { return !(*this < b); }
bool operator != (const bign& b) const { return b < *this || *this < b;}
bool operator == (const bign& b) const { return !(b != *this); }
};
bign f
;
void init() {
f[0] = f[1] = 1;
for (int i = 2; i < N; i++)
f[i] = f[i - 1]  + f[i - 2];
}

bign change (char vis[]) {
int cnt = strlen(vis);
bign c = 0;
for (int i = 1; i <= cnt; i++)
if (vis[cnt - i] == '1')
c = c + f[i];

memset(vis, 0, sizeof(vis));
return c;
}
bign tmp = 0;
void solve(bign sum) {
if (sum == tmp) {
printf("0\n");
return;
}
int i;
for (i = 1; i < N; i++)
if (f[i] > sum)
break;
int flag = 1;
for (i--; i; i--) {
if (f[i] <= sum && flag) {
sum = sum - f[i];
printf("1");
flag = 0;
} else {
printf("0");
flag = 1;
}
}
printf("\n");
}

int main () {
init();
int flag = 0;
char s1
, s2
;
while (scanf("%s%s", s1, s2) == 2) {
if (flag) printf("\n");
else flag = 1;

bign num1 = change(s1);
bign num2 = change(s2);

bign sum = num1 + num2;
solve(sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: