简单题!!极度不解:(

jp1984 2004-10-12 08:32:18
加精

  一个考古学家正在发掘古代的一座城市时,不小心被一个部分毁坏的石墙绊倒了。那个石墙上有数行奇异的数。这些数的前几位完整无缺,但不幸地,其余位的数字由于侵蚀作用而无法辨认。尽管如此,他注意到每一行完好的数字都像是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;
}
...全文
198 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
aheadyes 2004-10-14
  • 打赏
  • 举报
回复
2^k-1 可以代表任何自然数。所以输入的数可以表示为2^k-1。
而2^e的前几位 刚好要匹配2^k-1。 什么时候不匹配呢?
也就是2^e 要与 2^k-1 互质。具体如何判断。我数论不会:(
呵呵 我写了一个给定的数有匹配的:就可以得出e来。( 几个测试数据都通过了。

#include<iostream>
#include<string.h>


int a[100] = {0};
int b[30] = {0};
int t = 0;
char c[30];

void power(int k)
{
for(int i=0; i<k; i++)
{
for(int j=0; j<=t; j++)
a[j] *= 2;
for(int j=0; j<=t; j++)
{
if(a[j]>=10)
{
a[j+1] += a[j]/10;
a[j] = a[j]%10;
}
}
if(a[t+1]>0)
t++;
}
}

int ispower(int size)
{
int total = 3*(size-1);
power(total);
while(1)
{

int k = t,i;
for( i = size-1; i>=0; i--)
{
if(a[k--] == b[i])
continue;
else
break;
}
if(i == -1)
{
if(t >= 2*size)
return total;
}
total++;
power(1);
}


}
void Init()
{
for(int i=0; i<=100; i++)
a[i] = 0;
a[0] = 1;
t = 0;
}
int main()
{
int i=1;
a[0] = 1;
while( cin >> c)
{
Init();
int k = strlen(c);
for(int j=0; j<strlen(c); j++)
{
b[--k]= c[j]-48;
}

cout << ispower(strlen(c)) << endl;
}
return 0;
}
aheadyes 2004-10-14
  • 打赏
  • 举报
回复
if(e > 31)
{
cout << "no power of 2" << endl;
break;
}
是这样判断 no power 的吗?仅仅 e>31 就退出?

既然 输入的整数它们均小于2^31-1。至少最大也有 2^31。
那么e 将远远 大于 31。
aheadyes 2004-10-14
  • 打赏
  • 举报
回复
上面的 2^e 要与 2^k-1 互质 纯属虚构 -_-`~
不过如何证明 e 不存在;偶不懂。


gnefuil 2004-10-13
  • 打赏
  • 举报
回复
这题也没你想象的那么简单
提示一下,求log,数学推导一下,然后再做
jp1984 2004-10-13
  • 打赏
  • 举报
回复
[james@Mathematcs acm.problems]$ cat no1.cpp
#include <iostream>
#include <cstring>

using namespace std;

const int MAX = 100;
// evaluate 2^n

void print(int result[MAX])
{
int i = 0;
for(;i < MAX;i++)
cout << result[i];
cout << endl;
}
bool isPower(int result[MAX],string num)
{
int i,j,k = 0,l;
for(i = 0;i < MAX;i++)
if(result[i] != 0)
{
j = i;
break;
}
l = num.size(); // lenghth of the num
while((result[j + k] == (num[k] - '0')) && k < l)
k++;
if(k == l)
return true;

else return false;
}

int main()
{
string num;
cin >> num;
int result[MAX] = {0};
int e = 1,tmp,c;
result[MAX - 1] = 1;
while(1)
{
c = 0;
for(int i = 0;i < MAX;i++)
{
tmp = c;
c = result[MAX - i - 1] * 2 / 10;
result[MAX - i - 1] = result[MAX - i - 1] * 2 % 10 + tmp;
}
print(result);
if(isPower(result,num))
{
cout << e << endl;
break;
}
e++;
if(e > 31)
{
cout << "no power of 2" << endl;
break;
}
}
return 0;
}
//I use c++ rewrite it,but it seems the data is something wrong
// help~~
strolls 2004-10-13
  • 打赏
  • 举报
回复
其实还可以用别的方法,注意到条件:"输入文件包含一些正整数,它们均小于2^31-1。"
建立一个从2^E(E=1,2,3,...,31)的数组,然后.....
jp1984 2004-10-12
  • 打赏
  • 举报
回复
超级打击信心这么简单的题目居然....
:(
help~~~~

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧