看了后,理解到是求 所有位元能够保存的最大 m!.
后来看了大神的解释: 求 m!<=pow(2,n)-1;
=> log2(m!) <= log2(pow(2,n)-1);
=> log2(1)+log2(2)+...+log2(m)<=n; [2]
C里面#include<cmath>有log2()计算公式,直接套用计算就行了.
int main()
{
double bite[21]={4.0};
for(int i=1;i<21;i++)
bite[i]=bite[i-1]*2;///把1960->2160年间位元的长度全部求出.
int y;
while(scanf("%d",&y)&&y)
{
int label=(y-1960)/10;///调用位元长度.(1960年的位元数储存在下标为0处).
double BIT=bite[label],sum=0.0;
for(int i=1;;i++)
{
sum+=log2(i); ///叠加计算,调用上面公式[2],直到加到 m!>pow(2,n)-1.
if(sum>BIT)
{
printf("%d\n",i-1);
break;
}
}
}
return 0;
}