http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30506#problem/V
题意:从右向左,每一个位数,分别表示一个fibonacci数,1表示有,0表示没有;求两个数的和,同样按照这种形式存储
#include<map> #include<set> #include<list> #include<cmath> #include<ctime> #include<deque> #include<stack> #include<bitset> #include<cstdio> #include<vector> #include<cstdlib> #include<cstring> #include<iomanip> #include<numeric> #include<sstream> #include<utility> #include<iostream> #include<algorithm> #include<functional> using namespace std ; const int maxn = 110 ; char f1[ maxn + 10 ] , f2[ maxn + 10] , f[ maxn + 10 ] ; void Swap( char a[ ] ) { int len = strlen( a ) ; char temp ; for( int i = 0 ; i < len / 2 ; ++ i ) { temp = a[ i ] ; a[ i ] = a[ len - i - 1 ] ; a[ len - i - 1 ] = temp ; } } int main() { int Case = 0 ; while( scanf( "%s%s" , f1 , f2 ) != EOF ) { int len1 = strlen( f1 ) ; int len2 = strlen( f2 ) ; int len = len1 > len2 ? len1 : len2 ; Swap( f1 ) ; Swap( f2 ) ; Case++ ; if( Case != 1 ) { printf( " " ) ; } memset( f , '0' , sizeof( f ) ) ; for( int i = len1 ; i < maxn + 10 ; ++i ) { f1[ i ] = '0' ; } for( int j = len2 ; j < maxn + 10; ++j ) { f2[ j ] = '0' ; } for( int i = 0 ; i < len ; ++i ) { f[ i ] = f1[ i ] + f2[ i ] - '0' ; } for( int i = 0 ; i < maxn ; ++i ) { if( f[ i ] == '2' ) { f[ i + 1 ] ++ ; f[ i ] = '0' ; if( i == 1 ) { f[ i - 1 ]++ ; i -= 2 ; } else if( i > 1 ) { f[ i - 2 ]++ ; i -= 3 ; } } } for( int i = maxn ; i >= 1 ; --i ) { if( f[ i ] == '1' && f[ i - 1 ] == '1' ) { f[ i ] = '0' ; f[ i - 1 ] = '0' ; f[ ++i ]++ ; i += 2 ; } } int i ; for( i = maxn ; i >= 0 && f[ i ] == '0' ; --i ); { if( i == -1 ) { printf( "0" ) ; } else { for( ; i >= 0 ; -- i ) { printf( "%c" , f[ i ] ) ; } } printf( " " ) ; } } return 0; }