考古学家的困惑

来源:百度知道 编辑:UC知道 时间:2024/04/27 14:08:17
一个考古学家正在发掘古代的一座城市时,不小心被一个部分毁坏的石墙绊倒了。那个石墙上有数行奇异的数。这些数的前几位完整无缺,但不幸地,其余位的数字由于侵蚀作用而无法辨认。尽管如此,他注意到每一行完好的数字都像是2的幂的前几位,他就猜想这个石墙上原先的所有数都是2的幂。为了验证自己的想法,他选择了能看清楚的一些数写成列表,并把列表交给你,请你求出最小的2的幂使幂的前若干位与他提供的列表中的数一致。
所以你必须写一个程序,对于给定的整数N,求出最小的指数E使这个数的前若干位与N相同。注意:N的长度必须小于2^E的长度的一半。如N=1,当E等于4时,虽然2^4=16,但因为1的长度等于16的长度的一半,所以不满足题上的条件,而只有在E等于7时,2^7=128才满足题意。

输入
输入包括多组测试数据,每组测试数据对应输入的一行,每行包括一个整数N(1<=N<=100)。当N=0时输入结束,并且这组数据不包括在需要计算的数据中。

输出
对于输入的每一个数N,输出最小的正数E,使2^E的前若干位是N。(可以保证最后的结果E不会大于30)

样例输入
1
2
10
0

样例输出
7
8
20

我给你delphi的做法

function CountE(N: Integer): Integer;
var
NLen:Integer;//N的长度
PLen:Integer;//P的长度
P:Int64;
i:Integer;
begin
result:=0;
i:=1;
NLen:=Length(IntToStr(N));
while i<=30 do
begin
P:=trunc(Power(2,i));
PLen:=Length(IntToStr(p));
if NLen*2>=PLen then
begin
Inc(i);
Continue;
end;
if Copy(IntToStr(p),1,NLen)=IntToStr(n) then
begin
result:=i;
exit;
end
else
Inc(i);
end;
end;

......