给一个数字串x,求最小的正整数n,使得pow(2,n)==x*pow(10,y),并且y大于串n的长度。
所以:x*pow(10,y)<=pow(2,n)<(x+1)*pow(10,y)
转化为:log2(x)+n*log2(10)<=n<log2(x+1)+n*log2(10);
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
double Log(double x,double y)
{
return log10(y)/log10(x);
}
int main()
{
//freopen("in.in","r",stdin);
double n;
while(cin>>n)
{
long long len = log10(n)+1;
bool flage = false;
for(long long i = len+1;;i++)
{
if(flage) break;
double a,b;
a = Log(2,n)+i*Log(2,10);
b = Log(2,n+1)+i*Log(2,10);
for(long long j = (long long)a;j < b;j++)
{
if(j >= a && j < b){
cout<<j<<endl;
flage = true;
break;
}
}
}
}
return 0;
}