有人可以为这个问题找到一个不涉及转换到基础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
答案 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秒,只需要一点点优化工作。