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; }