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示例
=
思路:q^2 = q + 1 => q^n = q^(n-2)*q^2 = q^(n-1) + q^(n-2).因此:将字符串中的“011” 转换为“100”
#include <iostream> #include <cstring> using namespace std; const int SIZE = 1e5 + 10; char a[SIZE]; char b[SIZE]; void fun(char *p, int n) { for (int i = n-1; i >= 0; i--) { p[i+1] = p[i]; } p[0] = '0'; for (int i = n-2; i >= 0;) { if (p[i] == '0' && p[i+1] == '1' && p[i+2] == '1') { p[i] = '1'; p[i+1] = '0'; p[i+2] = '0'; if (i+2 <= n-2) { i += 2; } } else { i--; } } int start = 0; for (int i = 0; i <= n; i++) { if (p[i] == '1') { break; } else { start++; } } int i = 0; for (int j = start; j <= n; i++, j++) { p[i] = p[j]; } p[i] = '\0'; } int main() { cin >> a >> b; fun(a, strlen(a)); fun(b, strlen(b)); int m = strlen(a); int n = strlen(b); if (m == n) { int v = strcmp(a, b); if (v == 0) { cout << "=" << endl; } else if (v < 0) { cout << "<" << endl; } else { cout << ">" << endl; } } else { if (m > n) { cout << ">" << endl; } else { cout << "<" << endl; } } return 0; }