利用对数的性质
#include <stdio.h>
#include <math.h>
double a[260000];
int b[260000];
void init()
{
int i;
for(i=1; i<260000; i++)
{
a[i] = a[i-1] + log((double)i)/log(2.0);
}
for(i=1; i<260000; i++)
{
b[i] = floor(a[i]) + 1;
}
}
void func(double bits)
{
int l, r, m;
int target = (int)bits;
l = 1;
r = 259999;
while(1)
{
m = (l+r)/2;
if(b[m]<=target && target<b[m+1])
{
break;
}
else if(target < b[m])
{
r = m - 1;
}
else
{
l = m + 1;
}
}
//printf("target=%d b[m]=%d b[m+1]=%d a[m]=%lf a[m+1]=%lf\n", target, b[m], b[m+1], a[m], a[m+1]);
printf("%d\n", m);
}
int main(void)
{
int year;
init();
while(1)
{
scanf("%d", &year);
if(0 == year)
break;
func( pow(2.0,(year-1960)/10) *4 );
}
return 0;
}