该题主要是。将求出的结果(N)换算为没有连续1的串,从高位到低位寻找,找到第一个小于等于N的位置即为最后字符的长度,继续向前遍历组成N,位置赋值为 1 ,就将该数(Fn(i))从N中减去,直至遍历完成。(注意:如果i小于零,说明该数为 0 )
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
ll fn[50]={1,2,3,5,8};
void init(){
for(int i=5;i<50;i++)
fn[i]=fn[i-1]+fn[i-2];
}
void out(ll num,string& str){
int i;
for(i=41;i>=0;i--){
if(num>=fn[i]){
break;
}
}
for(int j=i;j>=0;j--){
if(num>=fn[j]){
str+='1';
num-=fn[j];
}else{
str+='0';
}
}
if(i<0)
str+='0';
}
int main()
{
init();
string str1,str2;
while(cin>>str1>>str2){
int len1=str1.length();
int len2=str2.length();
ll num1=0,num2=0,num3;
for(int i=0;i<len1;i++)
if(str1[len1-1-i]=='1')
num1+=fn[i];
for(int i=0;i<len2;i++)
if(str2[len2-1-i]=='1')
num2+=fn[i];
num3=num1+num2;
string str3;
str1.clear();str2.clear();
out(num1,str1);
out(num2,str2);
out(num3,str3);
cout<<" ";for(int i=0;i<str3.length()-str1.length();i++) cout<<' '; cout<<str1<<endl;
cout<<"+ ";for(int i=0;i<str3.length()-str2.length();i++) cout<<' '; cout<<str2<<endl;
cout<<" ";for(int i=0;i<str3.length();i++) cout<<'-'; cout<<endl;
cout<<" "; cout<<str3<<endl;
cout<<endl;
}
return 0;
}