题解:算出2的1~60次方,对每个进行匹配操作找到最小的;
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s[100];
int f(string n, string s)
{
int ans = 0;
int si = 0;
for (int i = 0; i < n.size(); i++)
{
if (n[i] == s[si])
{
si++;
if (si == s.size())
break;
}
}
ans += s.size() - si + n.size() - si;
return ans;
}
int main()
{
ll cnt = 1;
int x = 0;
while (x<=60)
{
x++;
cnt *= 2;
string t = to_string(cnt);
s[x] = t;
}
s[0] = "1";
int n;
cin >> n;
while (n--)
{
int x;
cin >> x;
string a = to_string(x);
int lenth = a.size();
int ans = INT_MAX;
for (int i = 0; i <= 60; i++)
{
ans = min(ans,f(a, s[i]));
}
cout << ans << endl;
}
}