q=5√+12, 在黄金系统下面 a0a1...an 等于 ∑ni=0ai∗qn−i ,其中 ai 是0或者1。
现在给出两个黄金系统下面的数字,请比较他们的大小。
单组测试数据。 第一行有一个字符串A。 第二行有一个字符串B。 按照a0到an的顺序输入。 他们都是非空串,可能有前导0,并且只有0和1组成,长度不超过100000。
如果A>B,输出>; 如果A=B,输出=; 如果A<B,输出<;
0010011
q=5√+12
这个q肯定不是白给的,在公式中我们要用到q的二次方,q的三次方等等
我们尝试着手动求一下
q的二次方= 计算一下 = q+1
q3=q*(q2)=q2+q1
q4=q*(q3)=q3+q2
我们会发现第i项是第i-1项加上第i-2项。
我们的AB除了0就是1.
我们会发现如果字符011 等同于 0*q(i ) + 1 *q(i-1) + 1*q(i-2)
而这个公式根据上面的推导,就是 1*q(i) + 0*q(i-1)+0*q(i-2)
所以我们就是不停地这样堆,形成一个新的字符串,进行比较。
00100 和11
11=100
对比00100和100 相同(忽略前置0),所以=
1000 和111
111 = 100 1 (011化为100)
1000 和1001 相比小于
110 和101
110 = 1000
1000和0101 小于
11和10
11 = 100
10 = 010
大于
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; char a[100006]; char b[100006]; int main() { while(~scanf("%s%s",a+1,b+1)) { a[0]='0'; b[0]='0'; int lena=strlen(a+1); int lenb=strlen(b+1); for(int i=0;i<=lena;i++) { for(int j=i;j>=0;j-=2) { if(a[j]=='0'&&a[j+1]=='1'&&a[j+2]=='1') { a[j+1]='0'; a[j+2]='0'; a[j]='1'; } else break; } } for(int i=0;i<=lenb;i++) { for(int j=i;j>=0;j-=2) { if(b[j]=='0'&&b[j+1]=='1'&&b[j+2]=='1') { b[j+1]='0'; b[j+2]='0'; b[j]='1'; } else break; } } cout<<a<<endl; cout<<b<<endl; if(lena>=lenb) { int flag=0; for(int i=0;i<lena-lenb;i++) { if(a[i]>'0')flag=1; } if(flag==1)printf(">"); else { for(int i=lena-lenb,j=0;i<=lena;i++,j++) { if(a[i]==b[j])continue; if(a[i]>b[j]) { flag=1; break; } if(a[i]<b[j]) { flag=2; break; } } if(flag==0)printf("="); if(flag==1)printf(">"); if(flag==2)printf("<"); } printf("\n"); } else { int flag=0; for(int i=0;i<lenb-lena;i++) { if(b[i]>'0')flag=1; } if(flag==1)printf("<"); else { for(int i=lenb-lena,j=0;i<=lenb;i++,j++) { if(a[j]==b[i])continue; if(a[j]>b[i]) { flag=1; break; } if(a[j]<b[i]) { flag=2; break; } } if(flag==0)printf("="); if(flag==1)printf(">"); if(flag==2)printf("<"); } printf("\n"); } } }