需要针对Java的base 2代码查询的策略

时间:2011-12-28 05:43:55

标签: java algorithm binary

有人可以为这个问题找到一个不涉及转换到基础2的策略吗?您不必编写代码,只需给我一个总体策略。

轮数

如你所知,奶牛没有手指或拇指,因此无法播放Scissors,Paper,Stone'(也称为'Rock,Paper,Scissors','Ro,Sham,Bo'和主持人其他名称),以便做出任意决定,例如谁先被挤奶。它们甚至无法翻转硬币,因为使用蹄子很难抛出。

因此,他们采用“圆数”匹配。第一头牛选择不到20亿的整数。第二头牛也这样做。如果数字都是“圆形数字”,则第一头牛获胜,否则第二头牛获胜。

如果是二进制,则正整数N被称为“圆数” N的表示具有与其相同的零或更多的零。例如,当以二进制形式写入时,整数9是1001.1001有两个零和两个1;因此,9是一个整数。整数26是二进制的11010;因为它有两个零和三个,所以它不是一个整数。

显然,将数字转换为二进制需要一段时间,所以 获胜者需要一段时间才能确定。 Bessie想要作弊并认为如果她知道在给定范围内有多少“圆形数字”,她就可以这样做。

通过编写一个程序来帮助她,该程序告诉输入给出的包含范围中有多少个圆数(1< = Start< Finish< = 2,000,000,000)。

输入(rndnum.in) 第1行:两个以空格分隔的整数,分别为Start和Finish。

输出(rndnum.out) 第1行:一个整数,是整数中的圆数 包容范围Start..Finish

示例输入

2 12

示例输出

6

1 个答案:

答案 0 :(得分:1)

我认为你不了解你的任务。要求声明 cows 无法轻易解决这些问题,但并未声明您的程序不允许这样做。

你的程序应该计算出给定范围内的“圆形”数字,如果不转换为二进制数,这很难做到。我认为这就是你的任务实际上要求你做的事情。

如果必须避免转换为二进制,还有另一种方法。您可以设置大小为16的数组,其中包含以下值:

0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4

表示0到15之间的1位数。

然后,在给定数字上使用除法和模数,可以快速得到该数字中的1位数(和0位)。

在伪代码中:

def getOneBits (num):
    lookup[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
    oneBits = 0
    for i = 1 to 8:
        oneBits = oneBits + lookup[num % 16]
        num = num / 16
    return oneBits

xstart = 271828
xend   = 314159
xcount = 0
for i = start to end:
    if getOneBits (i) <= 16:
        xcount = count + 1
print "There are " xcount " round numbers between " xstart " and " xend
  

顺便说一下,使用大小为256(字节而不是nybbles)的查找表在C中对此进行编码,我可以将时间缩短到大约6秒,只需要一点点优化工作。