Death to Binary? 分析模拟

/**
题目:Death to Binary? 
链接:https://vjudge.net/contest/154246#problem/T
题意:略。
思路:
注意事项:
给的字符串存在前导0;
存在0+0

*/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+10;
const double eps = 1e-6;
ll f[48];
int la, lb, lc;
void init()
{
    f[0] = 1;
    f[1] = 2;
    for(int i = 2; i < 48; i++){
        f[i] = f[i-1]+f[i-2];
    }
}

void removeLeadZero(char a[])
{
    int len = strlen(a);
    int i = 0;
    while(i<len&&a[i]=='0'){
        i++;
    }
    if(i==len){
        a[0] = '0';
        a[1] = '';
    }else
    strcpy(a,a+i);
}
void canonical(char a[])
{
    int len = strlen(a);
    int flag = 0;
    char temp[55];
    int t = 0;
    temp[t++] = a[0];
    for(int i = 1; i < len; i++){
        if(a[i]==a[i-1]&&a[i]=='1'){
            flag = 1;
            if(t!=1){
                temp[t-2] = '1';
                t--;
            }
            temp[t++] = '0';
            temp[t++] = '0';
            i++;
            while(i<len){
                temp[t++] = a[i++];
            }
            break;
        }else
        {
            temp[t++] = a[i];
        }
    }
    temp[t] = '';
    if(flag) canonical(temp);
    strcpy(a,temp);
}
void getC(ll x,char c[])
{
    lc = 0;
    int pos;
    for(int i = 0; i < 48; i++){
        if(f[i]>x){
            pos = i;
            break;
        }
    }
    pos = pos-1;
    while(pos>=0){
        if(f[pos]<=x){
            c[lc++] = '1';
            x -= f[pos];
        }else
        {
            c[lc++] = '0';
        }
        pos--;
    }
    if(lc==0){
        c[lc++] = '0';
    }
    c[lc] = '';
}
void print(char a[],char b[],char c[])
{
    canonical(a);
    canonical(b);
    canonical(c);
    //printf("a = %s b = %s c = %s
",a,b,c);
    lc = strlen(c);
    la = strlen(a);
    lb = strlen(b);
    int sp = 2+lc-la;
    while(sp--){
        printf(" ");
    }
    printf("%s
",a);
    printf("+");
    sp = 2+lc-lb-1;
    while(sp--){
        printf(" ");
    }
    printf("%s
",b);
    printf("  ");
    sp = lc;
    while(sp--){
        printf("-");
    }
    printf("
");
    printf("  ");
    printf("%s

",c);
}
int main()
{
    char a[55], b[55], c[55];
    init();
    while(scanf("%s%s",a,b)==2)
    {
        removeLeadZero(a);
        removeLeadZero(b);
        //printf("a = %s
",a);
        //printf("b = %s
",b);
        ll sa, sb, sc;
        sa = sb = 0;
        la = strlen(a);
        lb = strlen(b);
        for(int i = la-1; i >= 0; i--){
            if(a[i]=='1'){
                sa += f[la-1-i];
            }
        }
        for(int i = lb-1; i >= 0; i--){
            if(b[i]=='1'){
                sb += f[lb-1-i];
            }
        }

        sc = sa+sb;
        getC(sc,c);
        //printf("a = %s
",a);
        //printf("c = %s
",c);
        //printf("sa = %lld    sb = %lld
",sa,sb);
        print(a,b,c);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xiaochaoqun/p/6719809.html