UVA - 763 Fibinary Numbers

来源:互联网 发布:淘宝助理5.8 编辑:程序博客网 时间:2024/06/08 13:30

题意: 将用斐波那切表示的二进制相加,题目说可能一个数可以有几种不同的表示形式,那么要求不存在两个相邻的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;}


原创粉丝点击