题意: 将用斐波那切表示的二进制相加,题目说可能一个数可以有几种不同的表示形式,那么要求不存在两个相邻的1,至于二进制相加的时候有几个注意的地方,就是当ans[i]>=1的时候,如果ans[i-1]>=1的话,那么利用斐波那切的公式ans[i]=ans[i-1]+ans[i-2]
处理使得不存在相邻的两个1,还有的就是当ans[i]>=2的时候,利用ans[i+1]=ans[i]+ans[i-1],ans[i]=ans[i-1]+ans[i-2]得到2*ans[i] = ans[i+1]+ans[i-2],i==1的时候特殊处理
#include<stdio.h>
#include<string.h>
using namespace std;
char s1[111],s2[111];
int a[111],b[111],ans[111];
void calcu(int i){
if (i==0){
if (ans[i]==2)ans[0]=0,ans[1]++;
}
else if(ans[i-1]){
ans[i-1]--;
ans[i]--;
ans[i+1]++;
}
else if (ans[i]>=2){
ans[i]-=2;
ans[i+1]++;
if (i==1)
ans[0]++;
else{
ans[i-2]++;
calcu(i-2);
}
}
}
int main(){
int i,j,k,flag=0;
while(scanf("%s%s",s1,s2)!=-1){
if (flag)
puts("");
flag++;
int len1=strlen(s1);
for (i = 0;i < len1; i++)
a[i]=s1[len1-1-i]-'0';
int len2=strlen(s2);
for (i = 0; i < len2; i++)
b[i]=s2[len2-1-i]-'0';
if(len1<len2)
len1=len2;
for(i = 0; i < len1; i++){
ans[i]+=a[i]+b[i];
if(ans[i])
calcu(i);
}
if (ans[len1])
calcu(len1++);
if (ans[len1])
len1++;
for (i = len1-1; i >= 0;i--)
printf("%d",ans[i]);
puts("");
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(ans,0,sizeof(ans));
}
return 0;
}