题目地址:http://poj.org/problem?id=2116
思路:输入两个斐波那契数列基数制的数,转换成十进制,相加,再把这三个十进制数转换成规范性的斐波那契数列基数制的数。
注意输入的斐波那契数列基数制的数可能有零。
在转换成规范性的斐波那契数列基数制的数时,直接将十进制数化成尽可能大的斐波那契数列基数位即可。当斐波那契数列基数的第n位是1,第n-1位不可能也是1,因为 Fn = Fn-1 + Fn-2,第n-1位也是1时,第n+1位会变成1,而第n+1位会变成1早就转化成功了,不会存在第n+1位可以放两个1,Fn = Fn-1 + Fn-2,Fn-1 > Fn-2,那么会直接显示在第n+2位上。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <map>
#include <bitset>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
#define ll long long
using namespace std;
long long f[51];
void init()
{
f[0]=1;
f[1]=2;
for(int i=2;i<42;i++)
{
f[i]=f[i-1]+f[i-2];
}
}
void solve(long long ans,string &s)
{
int flag=0;
for(int i=40;i>=0;i--)
{
if(ans>=f[i])
{
flag=1;
s+='1';
ans-=f[i];
}
else
{
if(flag)
s+='0';
}
}
}
long long num(string s)
{
int j=0;
long long sum=0;
for(int i=s.length()-1;i>=0;i--)
{
if(s[i]=='1')
sum+=f[j];
j++;
}
return sum;
}
int main()
{
init();
string s1,s2,s3;
long long a,b,c;
while(cin>>s1>>s2)
{
a=num(s1);
b=num(s2);
c=a+b;
s1.clear();s2.clear();s3.clear();
solve(a,s1);
//cout<<s1;
solve(b,s2);solve(c,s3);
if(a==0) s1+='0';
if(b==0) s2+='0';
if(c==0) s3+='0';
int l1=s1.length();
int l2=s2.length();
int l3=s3.length();
cout<<' ';
for(int i=0;i<=(l3-l1);i++)
cout<<' ';
cout<<s1<<endl;
cout<<'+';
for(int i=0;i<=(l3-l2);i++)
cout<<' ';
cout<<s2<<endl;
cout<<' '; cout<<' ';
for(int i=0;i<l3;i++)
cout<<'-';
cout<<endl;
cout<<' '; cout<<' ';
cout<<s3<<endl;
cout<<endl;
}
return 0;
}