poj2116 模拟题

不知道错在哪里

/*
给定两个斐波那契表示数,要求用标准化表达方式表达
然后将这两个数加起来,和也用标准化方式表达 
思路:显然要将这两个数先用十进制表示,和也用十进制表示
然后在转化成二进制即可
1 1 2 3 5 8 13 21 34
用贪心法能保证1不连续 
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long 
using namespace std;
ll f[50],a,b,c; 
char buf[200],s1[200],s2[200];
void init(){
    f[1]=1;f[2]=2;
    for(int i=3;i<=45;i++)
        f[i]=f[i-1]+f[i-2];
}

int ans1[200],ans2[200],ans3[200],len1,len2,len3;
void solve(ll a,int *ans){//把a分解成斐波那契数列 
    for(int i=45;i>=1;i--){
        if(a==0) ans[45-i]=0;
        else if(a>=f[i]){
            ans[45-i]=1;
            a-=f[i];
        }
        else ans[45-i]=0;
    } 
}

int main(){
    init();
    while(scanf("%s %s",s1,s2)==2){ 
    memset(ans1,0,sizeof ans1);
    memset(ans2,0,sizeof ans2);
    memset(ans3,0,sizeof ans3);
    a=b=c=0;
        int Len1=strlen(s1);
        int Len2=strlen(s2);
        
        for(int i=0;i<Len1;i++)
            a+=(s1[i]-'0')*f[Len1-i];
        for(int i=0;i<Len2;i++)
            b+=(s2[i]-'0')*f[Len2-i];
                                    
        c=a+b;
        solve(a,ans1);
        solve(b,ans2);
        solve(c,ans3);    
        
        /*for(int i=0;i<=39;i++)cout<<ans1[i];
        puts("");
        for(int i=0;i<=39;i++)cout<<ans2[i];
        puts("");
        for(int i=0;i<=39;i++)cout<<ans3[i];
        puts("");*/
        
        len1=len2=len3=0;
        while(ans1[len1]==0)
            len1++;
        while(ans2[len2]==0)
            len2++;
        while(ans3[len3]==0)
            len3++;
        printf("  ");
        for(int i=len3;i<len1;i++)
            printf(" ");
        for(int i=len1;i<=44;i++)
            printf("%d",ans1[i]);
        puts("");
            
        printf("+ ");
        for(int i=len3;i<len2;i++)
            printf(" ");
        for(int i=len2;i<=44;i++)
            printf("%d",ans2[i]);
        puts("");
        
        printf("  ");
        for(int i=len3;i<=44;i++)
            printf("-");
        puts("");
        
        printf("  ");
        for(int i=len3;i<=44;i++)
            printf("%d",ans3[i]);
        
        puts("");
        puts("");
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/zsben991126/p/10445230.html