UVa 763 - Fibinary Numbers

来源:互联网 发布:淘宝网店退押金 编辑:程序博客网 时间:2024/06/06 05:47

题目:斐波那契进制加法。

分析:模拟、大整数。先将两数装换成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;}

原创粉丝点击