题目:斐波那契进制加法。
分析:模拟、大整数。先将两数装换成10进制加和,再转化回Fib进制数即可。
注意:fib(100)超过long long类型。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char a[105];
char b[105];
int F[105][31];
int c[105];
int V[31];
int cmp( int *a, int *b )
{
for ( int i = 25 ; i >= 0 ; -- i )
if ( a[i] != b[i] )
return a[i]-b[i];
return 0;
}
int main()
{
F[0][0] = F[1][0] = 1LL;
for ( int i = 2 ; i <= 101 ; ++ i ) {
for ( int j = 0 ; j < 25 ; ++ j )
F[i][j] = F[i-1][j]+F[i-2][j];
for ( int j = 0 ; j < 25 ; ++ j ) {
F[i][j+1] += F[i][j]/10;
F[i][j] %= 10;
}
}
int Count = 0;
while ( scanf("%s%s",a,b) != EOF ) {
memset( V, 0, sizeof(V) );
memset( c, 0, sizeof(c) );
//a转化成10进制
int La = strlen(a);
for ( int i = 1 ; i <= La ; ++ i )
if ( a[La-i] == '1' ) {
for ( int j = 0 ; j < 25 ; ++ j )
V[j] += F[i][j];
for ( int j = 0 ; j < 25 ; ++ j ) {
V[j+1] += V[j]/10;
V[j] %= 10;
}
}
//b转化成10进制
int Lb = strlen(b);
for ( int i = 1 ; i <= Lb ; ++ i )
if ( b[Lb-i] == '1' ) {
for ( int j = 0 ; j < 25 ; ++ j )
V[j] += F[i][j];
for ( int j = 0 ; j < 25 ; ++ j ) {
V[j+1] += V[j]/10;
V[j] %= 10;
}
}
for ( int i = 101 ; i >= 1 ; -- i )
if ( cmp( V, F[i] ) >= 0 ) {
c[i] = 1;
for ( int j = 0 ; j < 25 ; ++ j ) {
V[j] -= F[i][j];
if ( V[j] < 0 ) {
V[j] += 10;
V[j+1] -= 1;
}
}
}
if ( Count ++ ) printf("\n");
int end = 101;
while ( end > 1 && !c[end] ) -- end;
while ( end > 0 ) printf("%d",c[end--]);
printf("\n");
}
return 0;
}