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] = '\0'; }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] = '\0'; 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] = '\0'; } void print(char a[],char b[],char c[]) { canonical(a); canonical(b); canonical(c); //printf("a = %s b = %s c = %s\n",a,b,c); lc = strlen(c); la = strlen(a); lb = strlen(b); int sp = 2+lc-la; while(sp--){ printf(" "); } printf("%s\n",a); printf("+"); sp = 2+lc-lb-1; while(sp--){ printf(" "); } printf("%s\n",b); printf(" "); sp = lc; while(sp--){ printf("-"); } printf("\n"); printf(" "); printf("%s\n\n",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\n",a); //printf("b = %s\n",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\n",a); //printf("c = %s\n",c); //printf("sa = %lld sb = %lld\n",sa,sb); print(a,b,c); } return 0; }
posted on 2017-04-16 20:23 hnust_accqx 阅读(180) 评论(0) 编辑 收藏 举报