q=5√+12, 在黄金系统下面 a0a1...an 等于 ∑ni=0ai∗qn−i ,其中 ai 是0或者1。
现在给出两个黄金系统下面的数字,请比较他们的大小。
Input
单组测试数据。 第一行有一个字符串A。 第二行有一个字符串B。 按照a0到an的顺序输入。 他们都是非空串,可能有前导0,并且只有0和1组成,长度不超过100000。
Output
如果A>B,输出>; 如果A=B,输出=; 如果A<B,输出<;
Input示例
00100 11
Output示例
=
解:枚举几项就可以发现是斐波那契数列,但是不能直接相加比较,所以将他们的贡献值转化为最高位上 即可以比较大小
既然给出了斐波那契的数列 那么一定是要用到他的性质 f[i]=f[i-1]+f[i-2],即将11转化为100
注意细节 1111->10011->10100 注意暴力的姿势要好(即判断是否满足条件 满足-> j-=2 否则break)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
typedef long long LL;
char s1[N], s2[N];
int solve(char str[],int len)
{
int i;
int flag=0;
if(len>=2)
{
for(i=2;; i++)
{
for(int j=i;j>=0;j-=2)
{
if(str[j-2]=='1'&&str[j-1]=='1'&&str[j]!='1') flag=1, str[j]='1',str[j-2]='0',str[j-1]='0';
else break;
}
if(str[i]=='\0') break;
}
}
else i=len;
for(i=i-1; i>=0; i--)
if(str[i]!='0') break;
str[++i]='\0';
reverse(str,str+i);
str[i]='\0';
return flag==1;
}
int main()
{
memset(s1,'\0',sizeof(s1));
memset(s2,'\0',sizeof(s2));
scanf("%s %s",s1,s2);
int len1=strlen(s1),len2=strlen(s2);
reverse(s1,s1+len1);
reverse(s2,s2+len2);
solve(s1,len1);
solve(s2,len2);
len1=strlen(s1),len2=strlen(s2);
if(len1==len2)
{
for(int i=0; i<len1; i++)
{
if(s1[i]>s2[i])
{
puts(">");
return 0;
}
else if(s1[i]<s2[i])
{
puts("<");
return 0;
}
}
printf("=\n");
return 0;
}
else printf("%c\n",len1<len2?'<':'>');
return 0;
}