1491 黄金系统 思维题

q=5+12 在黄金系统下面 a0a1...an 等于  ni=0aiqni  ,其中  ai  是0或者1。

现在给出两个黄金系统下面的数字,请比较他们的大小。


Input
单组测试数据。
第一行有一个字符串A。
第二行有一个字符串B。
按照a0到an的顺序输入。
他们都是非空串,可能有前导0,并且只有0和1组成,长度不超过100000。
Output
如果A>B,输出>;
如果A=B,输出=;
如果A<B,输出<;
Input示例
00100

11

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值