简单题!!极度不解:(
一个考古学家正在发掘古代的一座城市时,不小心被一个部分毁坏的石墙绊倒了。那个石墙上有数行奇异的数。这些数的前几位完整无缺,但不幸地,其余位的数字由于侵蚀作用而无法辨认。尽管如此,他注意到每一行完好的数字都像是2的幂的前几位,他就猜想这个石墙上原先的所有数都是2的幂。为了验证自己的想法,他选择了能看清楚的一些数写成列表,并把列表交给你,请你求出最小的2的幂(如果存在)使幂的前若干位与他提供的列表中的数一致。
所以你必须写一个程序,对于给定的整数N,求出最小的指数E(如果存在)使2^E这个数的前若干位与N相同。注意:N的长度小于2^E的长度的一半。
输入
输入文件包含一些正整数,它们均小于2^31-1。数与数之间用空格(可能不止一个)或空行(可能不止一个)隔开。输入文件末尾可能会有多余的空行。
输出
对于输入文件的每一个数N,依次输出最小的正数E使2^E的前若干位是N(占一行)。如果E不存在,输出"no power of 2"(占一行)。
样例输入(dilemma.in)
1
2
10
样例输出(dilemma.out)
7
8
20
////////////////////////////////////////////////////////
#include <stdio.h>
#define N 100
int isPower(int result[N],char num[],int n)
{
/* brute match */
int i,j,k = 0;
for(i =0;i < N;i++)
if(result[i] != 0)
{
j=i;
break; /* the highest digit*/
}
for(;j < N;j++)
{/* remmember convert character to integer */
while((result[j + k] == (num[k] - '0')) && k < n)
k++;
if(k == n)
return 1;
k = 0;
}
return 0;
}
int main()
{
int result[N] = {0};
result[N - 1] = 2;
char num[N];
int i = 0,j,e = 1,size,c,t;
char n;
while((n = getchar()) != EOF && i < N)
{
num[i] = n;/* input n */
i++;
}
size = i;
while(1)/* brute check */
{
c = 0;
for(j = N - 1;j > -1;j--)
{
t = c;
c = result[j]*2/10;
result[j] = result[j]*2%10 + t;
}
if(isPower(result,num,size))
{
printf("%d\n",e);
break;
}
e++;
if(e > 31)
{/* no solution*/
printf("No power of 2\n");
break;
}
}
return 0;
}