本文主要是介绍UVA - 763 Fibinary Numbers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意: 将用斐波那切表示的二进制相加,题目说可能一个数可以有几种不同的表示形式,那么要求不存在两个相邻的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;
}
这篇关于UVA - 763 Fibinary Numbers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!